首页 > 其他 > 详细

无重复字符的最长子串

时间:2019-12-14 10:14:31      阅读:76      评论:0      收藏:0      [点我收藏+]

题目描述:

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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
题解:运用滑动窗口算法,滑动窗口算法可以解决数组/字符串的子元素问题,将嵌套循环问题转为单循环问题,降低时间复杂度。

在这一题中,窗口的大小是未知的。假设窗口左端指针为left,右端指针为right。只要窗口中没有重复元素,right就要向右继续移动。如果找到了重复元素,就要将left移动到窗口中重复元素的下一个位置,接着继续上述操作。在这里,关键就在于找到子串中重复元素的位置。这可以运用java中String类自带的方法来解决。

代码如下:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0||s==null){
            return 0;
        }
      int left=0;//记录窗口左端下标
      int right=1;//窗口右端下标,同时用来作为移动窗口的指针
      int location=-1;//记录重复元素在子串中的下标
      int len=1;//记录当前子串的长度
      int res=1;//记录最终结果
      while(left<s.length()&&right<s.length()){
          //查找right所指的元素在当前子串中的位置
          location=s.substring(left,left+len).indexOf(s.charAt(right));
          if(location==-1){//location等于-1意味着right所指元素和前面的元素都不重复
              len++;
              res=Math.max(res,len);
          }else{//重复了就要更新left和len
              left=left+location+1;
              len=right-left+1;
          }
          right++;//无论如何都要将right继续右移
      }
      return res;
    }
}

无重复字符的最长子串

原文:https://www.cnblogs.com/xbc121/p/12038194.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!