最长不含重复字符的子字符串
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; } }