這一道題類似正規表示式
實現支援如下特性的字串匹配程式:
(1) 』?』可匹配任意字元
0 次或者
1 次,如
「a?」
可匹配」a」
或者」 」
;(2) 』.』可匹配任意單個字元
; (3) 』*』可匹配任意字元任意多次,如
「a*」
可匹配」 」,」a」,」
aa」…
(4) 『+』可匹配任意字元至少
1 次,如
」a+」
可匹配」a」,」aa」…
(該項可選
) 輸入:
模式字串和待匹配字串,如
」a*b+c.d」
和」aabced」,
整個待匹配字串均要參與匹配;
輸出:返回布林值,表示是否能匹配上,如對於上述輸入而言,返回
true。
#include #include #include #include #include #define inf 10000
using namespace std;
bool match(string a, string b)
else if (!b.empty() && a.empty()) // 待匹配字串未空, 模式字串已空, 不可匹配
else if (b.empty() && !a.empty()) // 待匹配字串已空, 模式字串未空, 有可能能匹配
goto end;
} char chab = b.back();
while (!b.empty() && chab == b.back()) //取出待匹配字串尾部的只含一種字元的字串
//取出模式字串直到遇見不同的字母
while (!a.empty() && (a.back() == chab || a.back() == '.' ||
a.back() == '+' || a.back() == '*'
|| a.back() == '?'))
if (pattern.back() == '+' || pattern.back() == '*' || pattern.back() == '?')
//這幾個符號屬於前乙個字元, 歸還
end:
int dots = 0;
while (!pattern.empty() && pattern.back() == '.') //將'.'分離出, 它是可變的引數
int min = 0, max = 0;
while (!pattern.empty()) //計算取出的模式字串的可變長度
else if (pattern.front() == '*')
}else if (pattern.front() == '+')
min++;
} else if (pattern.front() == '.')
}else// if (pattern.front() == chab)
}pattern.pop_front();
} bool result = false;
for (int i = 0; i < dots; i++)
for (int i = 0; i <= dots; i++) //根據加'.'的多少, 進行分叉
result |= match(a, b);
if (!a.empty()) a.pop_back();
} return result;
}int main()
f >> str;
/*cin >> pattern;
cin >> str;*/
result = match(pattern, str);
if (result)
else cout << "false" << endl;
} return 0;
}
字串匹配
題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...
字串匹配
time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...
字串匹配
面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...