给定一个字符串 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); } }