找出字符串中第一个匹配项的下标(Leetcode28)

例题:

找出字符串中第一个匹配项的下标(Leetcode28)_第1张图片

分析:

题目的意思就是:

先给出一个字符串pattern,要拿着pattern字符串和原始字符串(origin)比对,若在origin中找到了pattern字符串,则返回pattern字符串在原始字符串origin中的下标。

                        找出字符串中第一个匹配项的下标(Leetcode28)_第2张图片

先拿着pattern和origin从第一个字符开始依次比对。

找出字符串中第一个匹配项的下标(Leetcode28)_第3张图片找出字符串中第一个匹配项的下标(Leetcode28)_第4张图片

单个字符比对若一致, 继续往下比对其它字符。

找出字符串中第一个匹配项的下标(Leetcode28)_第5张图片

直到找出第一个比对不成功情况,此时可以把 i 向右移动一位(i++), j 回到0索引,origin字符串从 i = 1索引开始重新和pattern比对,如下图:

找出字符串中第一个匹配项的下标(Leetcode28)_第6张图片

重复上述步骤,在原始字符串(origin)中找到和pattern相同的部分,返回当前索引 i :

找出字符串中第一个匹配项的下标(Leetcode28)_第7张图片

思路:

可以使用两个循环来依次比对,外层循环表示从原始字符串索引 i 开始和pattern进行比对,

注意:外层循环不必循环origin.length 次,循环origin.length - pattern.length 次即可。

代码实现:
package leetcode;

public class StrStrLeetcode28 {
    public static int strStr(String haystack, String needle) {
        char[] pattern = needle.toCharArray();
        char[] origin = haystack.toCharArray();
        int i = 0;  //原始数组的索引
        int j = 0;  //模式数组的索引
        while(i <= origin.length - pattern.length){
            for (j = 0; j < pattern.length; j++) {
                if(origin[i + j] != pattern[j]){
                    break;
                }
            }
            if(j == pattern.length){  //表示pattern字符串中的所有字符都成功匹配了origin
                return i;
            }
            i++;
        }
        return -1;
    }
    public static void main(String[] args) {
        System.out.println(strStr("aaacaaab", "aaab"));
    }
}

你可能感兴趣的:(算法,数据结构)