力扣(LeetCode)试题28-实现strStr() C++代码
没想到的点:若haystack="mississippi",needle = "issip"。按我的匹配算法(在haystack中检索needle的第一个元素,若没有该元素返回-1,若有则搜索后边的元素是否对应,这是有问题的!!),匹配到haystack中前部分issis,程序就结束了,返回了-1,实际应该匹配到issip。缜密的逻辑还需要不断提升呀!(基于此思想改动的代码已经补上,在最后:即在haystack中,第一个i不满足条件,循环退出,找寻第二个i,第三个i,直到满足条件,否则返回-1)
错误代码记录一下吧,如下:
1 class Solution 2 { 3 public: 4 int strStr(string haystack, string needle) 5 { 6 if (needle.length() == 0) return 0; 7 else { 8 int i = 0; 9 while (i < haystack.length()) 10 { 11 if (haystack[i] != needle[0]) 12 { 13 i += 1; 14 } 15 else 16 //否则,haystack中存在needle中的第一个元素,然后判断是不是needle整个元素 17 { 18 int k = 0; //指向needle的头元素 19 int limit = needle.length(); 20 while (k < limit) 21 { 22 if (haystack[i] != needle[k]) 23 return -1; 24 else 25 { 26 i += 1; 27 k += 1; 28 } 29 } 30 return i - k;//循环完毕,此时i指向了needle最后一个元素,需要减去这个needle的长度 31 } 32 } 33 return -1; 34 } 35 } 36 37 };
使用substr()方法的代码如下:
1 #include <iostream>
2
3 using namespace std;
4
5 class Solution
6 {
7 public:
8 int strStr(string haystack, string needle)
9 {
10 int needle_size = needle.length();
11 int haystack_size = haystack.length();
12 int res = haystack_size - needle_size;
13 if (needle_size == 0) return 0; //特殊情况
14 else
15 {
16 //遍历haystack,寻找是否包含needle
17 for (int i = 0; i <= res; ++i)
18 {
19 string str = haystack.substr(i, needle_size);//substr从第i个位置截取,截取的长度为needle_size
20 if (str == needle) return i;
21 else continue;
22 }
23 return -1;
24 }
25 }
26
27 };
28
29 int main()
30 {
31 string haystack = "mississippi";
32 string needle = "issip";
33 Solution sol;
34 int p;
35 p = sol.strStr(haystack, needle);
36 cout << p << endl;
37 int u;
38 cin >> u;
39 return 0;
40 }
修改正确的代码如下:(啊,头秃)
1 #include <iostream>
2
3 using namespace std;
4
5 class Solution
6 {
7 public:
8 int strStr(string haystack, string needle)
9 {
10 int haystack_size = haystack.length();
11 int needle_size = needle.length();
12 int res = haystack_size - needle_size;
13
14 if (needle_size == 0) return 0;//特殊情况
15
16 else {
17 int i = 0;//指针,指向haystack中的元素
18 while (i <= res) //外层循环,用于找needle头元素在haystack中的位置。
19 {
20 if (haystack[i] != needle[0])
21 {
22 i += 1;
23 }
24 else
25 //在haystack中找到了needle的第一个元素,然后判断之后的元素是否属于needle
26 {
27 int count = 0;//记录循环比对次数
28 int k = 0; //指向needle的头元素
29 while (count<=needle_size)
30 {
31 //进入循环,比对该元素之后是否是needle所含元素,循环次数必不大于needle长度
32 if (haystack[i] != needle[k])//该元素之后的元素不属于needle
33 {
34 i = i - count + 1; //将i返回,指向haystack中下一个元素
35 break;//跳出此循环,去haystack中寻找下一个与needle头元素相同的元素下标
36 }
37 i += 1;//指针各加一,判断下一对儿元素是否一致
38 k += 1;
39 count += 1;//循环次数+1
40 if (count == needle_size)//循环次数=needle长度,则说明一一对应,此时i指向尾巴元素
41 return i - needle_size;
42
43 }
44 }
45 }
46 return -1;
47 }
48 }
49
50 };
51
52 int main()
53 {
54 string haystack = "mississippi";
55 string needle = "issip";
56 Solution sol;
57 int p;
58 p = sol.strStr(haystack, needle);
59 cout << p << endl;
60 int u;
61 cin >> u;
62 return 0;
63 }