最长不含重复字符的子字符串

1:题目描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

 

示例 1:

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

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

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

提示:

s.length <= 40000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2:题目分析

  如果获得一个字符串最长的字串尼?暴力方法显然是可以的,但是其时间复杂度是O(n^2)很是复杂,我们可以通过分析一个重复字串的特点来解决这个问题如

"abcabcbb"

这个字符串,中我们利用双指针形成的一个区间做来字串的范围,如果该字串不重复,则右移右指针,如果重复则右移左指针,知道该区间字串不是重复的为止,如果判断尼?只要左指针右移到出现重复位置的右侧即可!!

3:代码示例

package JianZhiOffer48;

/**
 * @author :dazhu
 * @date :Created in 2020/4/1 17:10
 * @description:
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[]args){
        Solution solution = new Solution();
        System.out.println(solution.lengthOfLongestSubstring("abcabcbb"));

    }
}


//输入: "pwwkew"
//输出: 3
//如何找打最长不重读的子串尼?很显然,可以通过双指针遍历的方式。
//右指针依次右移,每右移一次,如果没有形成重复字串,则继续右移。
//如果右移出现重复,则将左指针也右移,移过重复的字符,即跳过第一个重读的字符再次形成一个无重复字串,
//记录最长长度。找到最长长度即可。
class Solution {
    public int lengthOfLongestSubstring(String s) {
        //最长不重复字串长度。
        int length = 0;

        if(s.length()<=1){
            return s.length();
        }
        //提取Char[]
        char[] cs = new char[s.length()];
        s.getChars(0,s.length(),cs,0);
        //初始化左右指针
        int leftIndex = 0;
        int rigthIndex = 1;
        while(true){
            //当右指针达到边界时,break
            if(rigthIndex>=s.length()){
                break;
            }
            //如果有重复,则移动leftIndex,形成新的不重复的字串即可,
            //如果没有重复,则leftIndex保存不变!
            leftIndex = judgeRecur(cs,leftIndex,rigthIndex);
            rigthIndex++;
            //保存最长的不重复字串
            if(length <(rigthIndex - leftIndex)){
                length = rigthIndex - leftIndex;
            }

        }
        return length;
    }

    //判断char[] cs中从i到j-1位置,是否已经包含j位置字符?
    public int judgeRecur(char[] cs,int i,int j){
        int temp = i;
        //如果有重复,则return i+1,
        //跳到重复字符的后面一位,这样子就可以形成不重复的字串啦
        for(;i<j;i++){
            if(cs[i] == cs[j]){
                return i+1;
            }
        }
        //遍历完,也没有找到则return false。
        return temp;
    }

}

 

posted @ 2020-04-02 18:28  大朱123  阅读(360)  评论(0编辑  收藏  举报