LeetCode28.实现strStr

题目要求

/**
     * 给你两个字符串haystack 和 needle ,请你在 haystack
     * 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
     */

思路分析

  1. 由题目知为一个字符串匹配问题,首先考虑到的就是暴力匹配
  2. 依次遍历父字符串拿到每一个长度为子字符串的子串,然后依次和子字符串比较
  3. 若匹配成功则返回索引,若匹配失败则返回-1
  4. KMP优化算法也可以尝试

源码及分析

public int strStr(String haystack, String needle) {

        //父字符串长度
        int lenF = haystack.length();
        //子字符串长度
        int lenS = needle.length();
        //如果子字符串为空,即长度为0,则直接返回0(空字符串是所有字符串的子串,返回索引0)
        if (lenS == 0) {
            return 0;
        }
        //暴力匹配法,依次将父字符串长度为子字符串长度的字符串拿出来和子字符串比较,
        // 若相同,则返回索引,若不相同,则继续比较,知道最后,返回-1,代表没有相同的子串

        //比较次数为 (父字符串中可能含有子字符串长度的字符串数目),即父字符串长度-子字符串长度+1
        //若父字符串元素个数8,子字符串长度2,则应比较 8 - 2 + 1次
        for (int i = 0; i < lenF - lenS + 1; i++) {
            //设置flag,在每次比较前保证flag为true
            boolean flag = true;
            for (int j = 0; j < lenS; j++) {
                //若父字符串的子串和子字符串比较有不相同的字符,
                // 说明此字串不匹配,直接结束此次比较,开始下次比较
                if (haystack.charAt(i + j) != needle.charAt(j)){
                    flag = false;
                    break;
                }
            }
            //如果有匹配的子串,则直接返回
            if (flag){
                return i;
            }
        }
        //遍历完若没有匹配的子串,则返回-1
        return -1;
    }