leetcode之3 无重复字符的最长字串

该博客讨论了一个字符串处理问题,即如何找到一个字符串中不包含重复字符的最长子串的长度。作者提出了一种动态规划的思路,通过遍历字符串并维护一个滑动窗口,当遇到重复字符时更新窗口的起始位置,从而优化了搜索过程。在代码实现中,使用了双指针技巧,避免了不必要的回溯,提高了算法效率。最终,通过示例和调试,确定了正确的代码实现和逻辑。
摘要由CSDN通过智能技术生成

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 

思路是这样的,

首先想到的是,对于每一个遍历的i,比较a[i]前面 i- 1 个元素。如果都不同,那么size++,i++,继续比较下面。

测试中会有两个问题,一个每次j都从0开始,是否有必要,会不会影响计算效率。这个借鉴kmp算法的经验,其实如果某个 a[j] = a[i] ,那么下一趟j没有必要从0开始,而是直接从 j + 1 开始,从计算效率讲是这样。

后来发现从计算正确性讲也是这样,因为如果每次都从0开始比较,按照上图所示如果下一个a[i] = e, 这时候如果 j那边经过2个w,是检查不出来重复的。

然后就是size的设置,要从0开始,还是1,开始。然后size每次要置1或者0,这些都是通过程序的调试不断完善的。

现在把代码呈上:

public class NoRepeatChar{
    public static void main(String[] args) {
        String s = "pwwkew";
        int i,j,next_j = 0;
        int temp_size = 1;
        int size = 1;
        for(i = 1 ; i< s.length() ; i++){
            for(j = next_j ; j < i ; j++){//本来这里不是next_j ,而是从0开始的。

                if(s.charAt(i) == s.charAt(j)) {
                    next_j = j + 1;  //这一步是关键 
                    break;
                }
                temp_size++;
            }
            if(temp_size>size)
                size = temp_size;
            temp_size = 1;
      }
        System.out.println(size);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值