Leetcode刷题--28.实现strStr()函数

题目链接: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是数组,计算到''位置,结果为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是数组,但不需计算到'',结果为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