重中之重:find查询失败会返回一个特殊值,不是0,也不是末尾:str.size()-1。它是npos,在各个电脑上并不相同。通过string::npos来使用它
while(idx<=k.size()-s.size() && k.find(s,idx)!=string::npos ) {
cnt ++;
idx = k.find(s,idx)+1;
}
1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos。(返回值可以看成是一个int型的数)
1 #include
2 #include
3 #include
4 using namespace std;
5 int main()
6 {
7 ////find函数返回类型 size_type
8 string s("1a2b3c4d5e6f7jkg8h9i1a2b3c4d5e6f7g8ha9i");
9 string flag;
10 string::size_type position;
11 //find 函数 返回jk 在s 中的下标位置
12 position = s.find("jk");
13 if (position != s.npos) //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,
14 {
15 printf("position is : %d\n" ,position);
16 }
17 else
18 {
19 printf("Not found the flag\n");
20 }
21 }
2.返回子串出现在母串中的首次出现的位置,和最后一次出现的位置。
1 flag = "c";
2 position = s.find_first_of(flag);
3 printf("s.find_first_of(flag) is :%d\n",position);
4 position = s.find_last_of(flag);
5 printf("s.find_last_of(flag) is :%d\n",position);
3.查找某一给定位置后的子串的位置
1 //从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标
2 position=s.find("b",5);
3 cout<<"s.find(b,5) is : "<
4.查找所有子串在母串中出现的位置
//查找s 中flag 出现的所有位置。
flag="a";
position=0;
int i=1;
while((position=s.find(flag,position))!=string::npos)
{
cout<<"position "<
5.反向查找子串在母串中出现的位置,通常我们可以这样来使用,当正向查找与反向查找得到的位置不相同说明子串不唯一。
1 //反向查找,flag 在s 中最后出现的位置
2 flag="3";
3 position=s.rfind (flag);
4 printf("s.rfind (flag) :%d\n",position);
例题:
1.给出一个字符串,串中会出现有人名,找到一个只有一个人名的字符串。
1 #include
2 using namespace std;
3 vector s;
4 int main()
5 {
6 s.push_back("Danil");
7 s.push_back("Olya");
8 s.push_back("Slava");
9 s.push_back("Ann");
10 s.push_back("Nikita");///建立动态数组
11 string a;
12 cin>>a;
13 int res = 0;
14 for(int i = 0; i < 5; i++)
15 {
16 if(a.find(s[i]) != a.npos)
17 {
18 res++;
19 if(a.rfind(s[i]) != a.find(s[i]))///一个字符中出现多个一样的名字
20 {
21 res++;
22 }
23 }
24 }
25 if(res == 1)
26 {
27 cout<<"YES"<
2.你有n个字符串。 每个字符串由小写英文字母组成。 重新排序给定的字符串,使得对于每个字符串,在它之前的所有字符串都是它的子串。
https://www.cnblogs.com/wkfvawl/p/9229758.html
1 #include
2 #include
3 #include
4 #include
5 using namespace std;
6 bool cmp(string a, string b)
7 {
8 if (a.length() == b.length())
9 return a < b;
10 return a.length() < b.length();
11 }
12 int main()
13 {
14 int n;
15 string s[111];
16 scanf("%d", &n);
17 for (int i = 0; i < n; i++)
18 {
19 cin >> s[i];
20 }
21 sort(s, s + n, cmp);
22 int flag = 1;
23 for (int i = 1; i < n; i++)
24 {
25 if (s[i].find(s[i-1]) == string::npos)
26 {
27 flag = 0;
28 break;
29 }
30 }
31 if (flag)
32 {
33 cout << "YES" << endl;
34 for (int i = 0; i < n; i++)
35 {
36 cout << s[i] << endl;
37 }
38 }
39 else
40 {
41 cout << "NO" << endl;
42 }
43 return 0;
44 }
3.查询区间内子串在母串中的个数。
https://www.cnblogs.com/wkfvawl/p/9452869.html
1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std;
7 int main()
8 {
9 int n,m,q,i,j,l,r,len;
10 int counts;
11 int vis[10010];
12 string s1,s2;
13 cin>>n>>m>>q;
14 cin>>s1>>s2;
15 len=s2.size();
16 memset(vis,0,sizeof(vis));
17 string::size_type pos=0;
18 while((pos=s1.find(s2,pos))!=string::npos)
19 {
20 vis[pos+1]=pos+1;
21 pos++;
22 }
23 for(i=1;i<=q;i++)
24 {
25 counts=0;
26 scanf("%d%d",&l,&r);
27 for(j=l;j<=r;j++)
28 {
29 if(vis[j]!=0&&vis[j]+len-1<=r)
30 {
31 counts++;
32 }
33 }
34 printf("%d\n",counts);
35 }
36 return 0;
37 }