题目链接:https://leetcode-cn.com/problems/implement-strstr/
参考博客:https://blog.csdn.net/qq_30534935/article/details/82191979
题目描述:
解题思路:
分别对两个字符串设置移动标签i和j,比较并顺序移动她们,当标签j第一次顺序移动至字符串needle的末尾时即找到第一个匹配的字符串。需要注意的是,当字符串部分匹配时需要退回字符串haystack的标签i。
这里可以这样理解,如果匹配到第二个字符后第三个字符不同,即j=2,此时haystack的i为7,这是是从i=5开始匹配的,则现在需要从i=6开始匹配,即(i-j+1),达到目的。
class Solution { public: int strStr(string haystack, string needle) { int l1 = haystack.size();//haystack的长度 int l2 = needle.size();//needle的长度 int i = 0,j = 0;//设置移动标签 while(i < l1 && j < l2){//当没有比较到末尾时 if(haystack[i] == needle[j]){//如果相等都向后移 i++; j++; } else{//当字符串部分匹配时,需要回退标签j-1个 i = i - j + 1; j = 0; } } if(j == l2)//如果j达到了needle的末尾 return (i - j);//当needle为空串时返回0 else return -1; } };
注:
1. 使用了size()函数,这里区分一下length()、size()、sizeof()的区别。
c++中,length()只是用来获取字符串的长度。
例如:string str = "asdfghjkl"
则str.length() = 9。
c++中,在获取字符串长度时,size()函数与length()函数的作用相同。
除此之外,size()函数还可以获取vector类型的长度。
例如:vector <int> num(15,2)
则num.size() = 15。
sizeof()运算符用来求对象所占内存空间的大小。
(1)获取基本类型的大小
在windows64系统环境下,各种基本类型的大小如下:
sizeof(char)=1 , sizeof(int)=4 , sizeof(long)=8 , sizeof(float)=4 , sizeof(double)=8 , sizeof(string)=28。
除此之外,64位编译器下指针型的长度为8(32位为4),即:
sizeof(int*) = sizeof(float*) = sizeof(char*) = 8。
常量值及变量值的长度,等同于它的实际类型长度的:
sizeof(2)=4 , sizeof(3.14)=8。
(不定义类型的情况下,计算机默认3.14为double类型)
3.2 求取数组所占内存空间的大小
Example:
char c[] = "asdsds"; char* cc = c; char cn[40] = "asdsds"; int a[] = {1,2,3,4,5,6}; int* aa = a; cout << sizeof(c) << sizeof(cc) << sizeof(*cc) << sizeof(cn); cout << sizeof(a) << sizeof(aa) << sizeof(*aa);
Output:
sizeof(c) = 7 //c是数组,计算到‘\0‘位置,结果为6*1+1=7 sizeof(cc) = 8 //cc为指针类型,大小为8 sizeof(*cc) = 1 //*cc指向c的第一个字符,大小为1 sizeof(cn) = 40 //开辟40个char空间,大小为40*1=40 sizeof(a) = 24 //a是数组,但不需计算到‘\0‘,结果为6*4=24 sizeof(aa) = 8 //aa为指针类型,大小为8 sizeof(*aa) = 4 //*aa指向a的第一个数字,大小为4
3.3 获取数组长度
Example:
int array[] = {6,5,4,3,2,1}; int length1 = sizeof(array)/sizeof(array[0]); int length2 = sizeof(array)/sizeof(*array); int length3 = sizeof(array)/sizeof(int); cout << length1 << length2 << length3;
Output:
length1 = 6 length2 = 6 length3 = 6
值得一提的是,若将第一行代码改为:int array[10] = {6,5,4,3,2,1};
则length1、length2、length3的长度都将变成10,即未赋值的空余部分仍旧算在内。
原文:https://www.cnblogs.com/lbwBH/p/14491960.html