• 手写Java函数IndexOf,leetcode28


    1.问题不再描述

    实现A.indexOf(B)

    2.思路

    两个字符串各设置一个指针,进行匹配,下面将A称为母串,B称为子串,指针分别称为母指针和子指针。

    两个指针指向的字符如果相同的话,判断是否是匹配状态,如果两个字符串是第一次匹配,就记录下当前位置,并继续向后匹配。

    因此,我们需要判断当前是否在匹配状态中,使用布尔标值来判断。如果两个字符串是第一次匹配,还需要将标值改为匹配状态。

    如果已在匹配状态,只需要向后移动即可。

    如果两个字符不匹配,子指针直接置0,母指针返回到本次匹配开始字符位置的后一位,而非当前位置向后一位

    以字符串“mississippi”和"issip"为例(lc测试用例45),初始状态如下:

     第一次没有匹配上,因此,子指针置0,状态改为不匹配,母指针加1,变成下图所示情况

     

     注意,此次母子指针能够匹配,判断标志f的状态,是fasle表示本次匹配是匹配的开始,记录下匹配开始的位置Index = 1,然后将f修改为true,表示在匹配状态中。两个指针同时向后移动一位

    接下来仍是匹配,但是由于f已经是true,此时表示正在匹配状态中,只需将两个指针向后移动即可,直到子串被完全匹配或者匹配到一半停止,如下所示

     不匹配,子指针置0,母指针看index是否为-1,如果不是,那就变成Index+1,匹配状态重置为未匹配,并且将Index重置为-1

     直到再次匹配。

    3. 代码实现

    class Solution {
        public int strStr(String haystack, String needle) {
                int len = haystack.length();
                int len2 = needle.length();
                if(len2 == 0)
                return 0;
                if(len2 > len)
                return -1;
                int i = 0, j = 0;
                int Ind = -1;
                boolean f = false;
                while(i < len && j < len2)
                {
                    if(haystack.charAt(i) == needle.charAt(j) )
                    {
                        if(f == false)
                        {
                            Ind = i;
                            i++;
                            j++;
                            f = true;
                        }
                        else
                        {
                            i++;
                            j++;
                        }
                    }
                    else
                    {
                        i = (Ind == -1)?(i+1):(Ind+1);
                        j = 0;
                        f = false;
                        Ind = -1;
                    }
                }
                if(j < len2)
                Ind = -1;
                return Ind;
        }
    }

     4.遇到的问题

    (1)未考虑到母串比子串短的情况

    (2)

  • 相关阅读:
    Windows下使用CMake编译SuiteSparse成VS工程
    【设计模式
    【设计模式
    vue过滤和复杂过滤
    el-tooltip 自定义样式
    el-table加表单验证
    使用Go env命令设置Go的环境
    面试官:GET 和 POST 两种基本请求方法有什么区别?
    解决 Vue 重复点击相同路由报错的问题
    利用promise和装饰器封装一个缓存api请求的装饰器工具
  • 原文地址:https://www.cnblogs.com/lbrs/p/13452051.html
Copyright © 2020-2023  润新知