//在字符串中找到子字符串第一次出现的位置
/*
给定两个字符串str1和str2,找到str2在str1中第一次出现的位置,返回下标。
*/
//#include<iostream>
//#include<vector>
//#include<string>
//using namespace std;
//
///* 以下函数可以输出子串第一次的位置 */
int findSubstring(string masterstring,string teststring) {
string str = "";
//边界判断
if (masterstring.size() == 0 || teststring.size() == 0 || masterstring.size() < teststring.size()) {
return -1;
}
int i = 0, j = 0;
while (i < masterstring.size() && j < teststring.size()) {
if (masterstring[i] == teststring[j]) { //字符相等
i++;
j++;
}
else {
i = i - j + 1; //主串指针开始回溯
j = 0; //j依然从头开始遍历
}
}
//退出循环
//1)找到子串,此时 j = teststring.size();
//2)没找到子串 此时i一定会遍历到了最后一个位置,直到 i = masterstring.size()退出循环;
if (j == teststring.size()) {
return i - j;
}
else {
return -1;
}
}
//
///* 主函数 */
int main() {
string masterstring = "abcabadeaaba";
string teststring = "aba";
//调用库函数查询
//string::size_type idx = masterstring.find(teststring);
//不调用库函数查询子串的位置、下标 -- 在str1中找str2第一个字符出现的位置,然后再一个字符一个字符的比较str1
//和str2,如果到str2结束都相等,则找到str2在str1中第一次出现的位置。否则再在str1中找str2的第一个字符出现
//的位置.
int index;
index = findSubstring(masterstring,teststring);
cout << index << endl; //这样写只会输出子串第一次出现的位置;
//cout << idx << endl;
system("pause");
return 0;
}
//
//
统计子串出现的次数 -- 每次将匹配的位置放到一个数组中,最后返回数组的长度
//int findstrnum(string masterstring,string teststring) {
// //边界判断
// if (masterstring.size() == 0 || teststring.size() == 0 || masterstring.size() < teststring.size()) {
// return -1;
// }
// vector<int> strnum;
// int i = 0, j = 0;
// int recordi = 0;
// while (i < masterstring.size() && j < teststring.size()) {
// if (masterstring[i] = teststring[j]) {
// i++;
// j++;
// recordi++;
// }
// else {
// i = recordi - j + 1;
// j = 0;
// }
// if (j == teststring.size()) { //证明找到一个匹配的串
// strnum.push_back(i-j);
// j = 0;
// }
// }
//}
//
//int main() {
//
// string masterstring = "abcabadeaaba";
// string teststring = "aba";
//
// //统计出现的次数
// findstrnum(masterstring,teststring);
//
// system("pause");
// return 0;
//
//}
字符串匹配完整版
最新推荐文章于 2023-07-02 21:59:02 发布