1. 程式人生 > >華為oj 字串萬用字元

華為oj 字串萬用字元

本題,其實和分蘋果的題有那麼一丟丟的類似,在此提供兩種能通過的解法(主要就是對於‘*’的處理)

1.這種解法其實是錯誤的,但是也要說說他的思路,對於 ‘*’ 他直接找 ‘*’ 下一個字元是否出現在需要匹配的串中,並且找到那個位置,認為此位置到之前就是‘*’所匹配的內容。

但是這種解法是錯誤的,在此給出一個測試用例

J*Smi??

JhonSSmith

至於為什麼他能通過,oj太爛被!

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string str1, str2;
	int i, j,len1,len2;

	cin >> str1 >> str2;
	len1 = str1.size();
	len2 = str2.size();
	i = j = 0;

	while (i < len1&&j < len2)
	{
		if (str1[i] == '?')
		{
			i++;
			j++;
		}
		else if (str1[i] == '*')
		{
			i++;
			j=str2.find(str1[i], j);//這就是我上面思路中的關鍵語句

			if (j == string::npos)
			{
				j = len2;
			}
		}
		else
		{
			if (str1[i] == str2[j])
			{
				i++;
				j++;
			}
			else
			{
				cout << "false";
				return 0;
			}
		}
	}

	if (i == len1 && j == len2)
		cout << "true";
	else
		cout << "false";

	return 0;
}

2.這種提供的方法,我認為是標準的解法,先看程式碼,再解釋
#include <iostream>
using namespace std;

bool ISMatch(char *s1, char *s2, int p, int q)
{
	if (p<0 && q<0)
	{
		return true;
	}
	if (p<0 || q<0)
	{
		return false;
	}

	if (s1[p] == '*')
	{
		return ISMatch(s1, s2, p-1, q) || ISMatch(s1, s2, p, q-1);
	}
	if (s1[p] == s2[q] || s1[p] == '?')
	{
		return ISMatch(s1, s2, p-1, q-1);
	}

	return false;
}
int main()
{
	char inStr[30];
	char matchStr[30];
	bool ret;

	gets_s(inStr);
	gets_s(matchStr);
	if (inStr == NULL || matchStr == NULL)
	{
		cout << "false" << endl;
		return 0;
	}

	ret = ISMatch(inStr, matchStr, strlen(inStr) - 1, strlen(matchStr) - 1);
	if (ret)
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}
	return 0;
}
解釋:對於 ‘*’ 的處理,要麼匹配0次,對應語句ISMatch(s1,s2,p-1,q),要麼匹配多次ISMatch(s1,s2,p,q-1),對於遞迴截止條件,只有當p和q同時小於0,即都匹配完成時才算匹配成功!

相關推薦

oj 字串字元

本題,其實和分蘋果的題有那麼一丟丟的類似,在此提供兩種能通過的解法(主要就是對於‘*’的處理) 1.這種解法其實是錯誤的,但是也要說說他的思路,對於 ‘*’ 他直接找 ‘*’ 下一個字元是否出現在需要匹配的串中,並且找到那個位置,認為此位置到之前就是‘*’所匹配的內容。

OJ——字串字元

題目描述   問題描述:在計算機中,萬用字元一種特殊語法,廣泛應用於檔案搜尋、資料庫、正則表示式等領域。現要求各位實現字串萬用字元的演算法。 要求: 實現如下2個萬用字元: *:匹配0個或以上的字元(字元由英文字母和數字0-9組成,不區分大小寫

字串字元/機試(C/C++)

題目描述 問題描述:在計算機中,萬用字元一種特殊語法,廣泛應用於檔案搜尋、資料庫、正則表示式等領域。現要求各位實現字串萬用字元的演算法。 要求: 實現如下2個萬用字元: *:匹配0個或以上的字元(字元由英文字母和數字0-9組成,不區分大小寫。下同) ?:匹配1個字元 輸

機試071】字串字元

題目描述: 在計算機中,萬用字元一種特殊語法,廣泛應用於檔案搜尋、資料庫、正則表示式等領域。現要求各位實現字串萬用字元的演算法。 要求: 實現如下2個萬用字元: *:匹配0個或以上的字元(字元由英文字母和數字0-9組成,不區分大小寫。下同) ?:匹配1個字元 輸入: 萬用字元表示式;

code中的字串字元匹配

#define FALSE 0 #define TRUE 1 #define M 300 #include<stdio.h> #include<string.h> int equal(char *s, char *p) { char tem

oj 字串個數統計&&數字顛倒&&字串翻轉&&字元逆序&&求int型資料在記憶體中儲存時1的個數

同樣只上程式,都是簡單題 #include<iostream> using namespace std; int main() { int in[128], count = 0; char n,temp[100]; memset(in, 0, sizeo

因80戶資訊誤刪遭移動5億罰款 又是臨時工闖的禍?

2017年最倒黴的工程師誕生了,這位仁兄在升級移動的HLR時一個小小的誤操作, 80萬南寧移動使用者資料丟失。估計事故發生時,這位大神菊花一緊,已經瞬間“石化”。 有訊息稱,因為此次事故,華為已經被中國移動處以5億罰款,同時中國移動已經展開全國範圍的系統大排查,主要針對華為第三方代維隱患問題。 事

【每日面試題】字串字元匹配問題

題目:在一篇英文文章中查詢指定的人名,人名使用二十六個英文字母(可以是大寫或小寫)、空格以及兩個萬用字元組成(*、?),萬用字元“*”表示零個或多個任意字母,萬用字元“?”表示一個任意字母。 如:“J* Smi??” 可以匹配“John Smith” . 請用C語言實現如下

oj 字串匹配

用一個數組儲存每個字元出現的個數然後,然後進行判斷就行! #include<iostream> #include<string> using namespace std; int main() { int trans[128]; memset(

oj 簡單密碼破解&&汽水瓶&&刪除字串中出現次數最少的字元&&字串排序

這四道題就不上圖了,因為太簡單,就四道題湊在一起了,應該放在簡單題中。 第一題.這道題只需要注意字母‘Z’時候的轉換,直接上程式碼 #include<iostream> #include<string> using namespace std;

oj:計算字串最後一個單詞的長度,單詞空格隔開

/* 描述 計算字串最後一個單詞的長度,單詞以空格隔開。 知識點 字串,迴圈 執行時間限制 0M 記憶體限制 0 輸入 一行字串,長度小於128。 輸出 整數N,最後一個單詞的長度。

LeetCode 10 & 44 正則表示式匹配 & 字元匹配 字串匹配問題

10 正則表示式匹配 給定一個字串 (s) 和一個字元模式 (p)。實現支援 ‘.’ 和 ‘*’ 的正則表示式匹配。 ‘.’ 匹配任意單個字元。 ‘*’ 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。 說明: s 可能為

字串反轉——來自OJ平臺測試基礎篇

 /*  * 字串反轉  * 與字元逆序一樣,是同一個程式  * 描述:  寫出一個程式,接受一個字串,然後輸出該字串反轉後的字串。例如:  * 知識點:  陣列,指標   * 題目來源:  內部整理   * 練習階段:  初級   * 執行時間限制: 10Se

python-進階教程-利用字元進行字串匹配

0.摘要 在Linux Shell中,我們可以用ls *.py的命令顯示所有以.py結尾的檔案或資料夾。在python中我們可以藉助fnmatch模組,實現含萬用字元的字串匹配。   1.常用萬用字元 符號 作用

在mySQl中,SQL語言允許使用字元進行字串匹配的操作,其中“%”不能表示()。A.0個字元B.一個字元C.多個字元D.搜尋關鍵字中包含字元“%”

加粗樣式@TOC 歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯

對Java字元的個人理解(以集合例)

二、泛型萬用字元講解  <一>萬用字元的使用以及程式碼演示       1.無限萬用字元<?>的使用:可以傳入任何引用資料型別 A 在呼叫方法時使用?萬用字元的過程中無法使用add方法。原因分析:因為萬用字元?代表任意的資料型別,但是當我們呼叫的時候或者用在方法的宣告上,其實這個

oj 公共字串計算

此題是經典的動態規劃的題:設c[i][j] 表示第一個字串從開始到 i 的位置,和第二個字串從開始到 j 的位置的最長公共字串的長度,那麼我們可以根據題目得知一下條件 1.如果pFirstStr[i+1]==pSecondStr[j+1],那麼c[i+1][j+1]=c[

oj 明明的隨機數&&計算字元個數

在此提供三種解法,其實三種解法殊途同歸,不就是排個序,去個重就好! 1.利用map特點,插入map之後,會自動根據關鍵字排序,而且不會出現相同的關鍵字,正好滿足特性 #include<iostream> #include<map> using na

[OJ--C++]088-按位元組擷取字串

題目描述:編寫一個擷取字串的函式,輸入為一個字串和位元組數,輸出為按位元組擷取的字串。但是要保證漢字不被截半個,如"我ABC"4,應該截為"我AB",輸入"我ABC漢DEF"6,應該輸出為"我ABC"

OJ字串加解密

題目描述 1、對輸入的字串進行加解密,並輸出。 2加密方法為: 當內容是英文字母時則用該英文字母的後一個字母替換,同時字母變換大小寫,如字母a時則替換為B;字母Z時則替換為a; 當內容是數字時則把該數字加1,如0替換1,1替換2,9替換0; 其他字元不做變化。 3