算法学习5(题解)

算法学习5(题解)

本人博客

1.题目

给你两个字符串haystackneedle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从 0 开始)。如果needle不是haystac的一部分,则返回 -1

2.实例

实例1

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

实例二

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

实例三

输入:haystack = "imimmip", needle = "immip"
输出:2

3.代码

鄙人的:

    public int strStr(String haystack, String needle) {
        int len = 0, temp = 0;
        for(int i = 0;i < haystack.length();i++){
            /* 找到第一个相等的字符位置 */
            if(haystack.charAt(i) == needle.charAt(len)){
                len = i + needle.length();
                int x = i+1;
                if(len > haystack.length()){
                    return -1;
                }
                if(needle.length() == 1){
                    return i;
                }
                /* 查找剩下的*/
                for (int j = 1; x < len; x++, j++) {
                    if(haystack.charAt(x) != needle.charAt(j)){
                        break;
                    }
                    /* Found whole string. */
                    if (x == len-1){
                        return a;
                    }
                }
                len = 0;
            }
        }
        return -1;
    }

官方的:

    public int strStr(String haystack, String needle) {
         int sl = haystack.length();
        int cl = needle.length();

        if (cl > sl) {
            return -1;
        }

        char first = needle.charAt(0);
        int max = sl-cl;

        for (int i = 0; i <= max; i++) {
            /* 找到第一个相等的字符位置 */
            if (haystack.charAt(i) != first) {
                while (++i <= max && haystack.charAt(i) != first);
            }

            /* 查找剩下的*/
            if (i <= max) {
                int j = i + 1;
                int end = j+cl-1;
                for (int k =  1; j < end && haystack.charAt(j) == needle.charAt(k); j++, k++);

                if (j == end) {
                    /* Found whole string. */
                    return i ;
                }
            }
        }
        return -1;
    }
来源:力扣(LeetCode

4.思路

鄙人的方法和leetcode官方题解的方法差不多,解法就有些许不同。

  1. 首先通过遍历haystackneedle的第一个字符进行比较找出第一个相等的字母,找不到的话我直接返回-1leetcode则做了预处理;
if(len > haystack.length()){
    return -1;
}
-------------------------------
int max = sl-cl;
for (int i = 0; i <= max; i++) {
  1. 接下来就是匹配剩下的字母,匹配成功的话就返回开始索引,匹配不成功的话则继续进行下一次循环,设置外循环的原因是为了处理实例三这类情况——开头字母重复出现,需要依次遍历排除;
  2. 匹配成功的条件都是第二个循环中的索引值是否增加了needle字符个长度,区别在于leetcode在循环外进行判断,而我在循环中进行判断,效率更低而且还要额外排除needle长度为1的情况,显得多此一举。
if(needle.length() == 1){
    return i;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值