3. 无重复字符的最长子串
给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
- 0 <= s.length <= 5 * 104
- s 由英文字母、数字、符号和空格组成
public class Test3 {
public static void main(String[] args) {
String s1="pwwkew";
String s2="happybirthday";
String s3="";//空串
String s4=" ";//空格串
String s5="a";//单字符串
String s6="bb";
System.out.println(s1+"的最长子串的长度为"+lengthOfLongestSubstring(s1));
System.out.println(s2+"的最长子串的长度为"+lengthOfLongestSubstring(s2));
System.out.println(s3+"的最长子串的长度为"+lengthOfLongestSubstring(s3));
System.out.println(s4+"的最长子串的长度为"+lengthOfLongestSubstring(s4));
System.out.println(s5+"的最长子串的长度为"+lengthOfLongestSubstring(s5));
System.out.println(s6+"的最长子串的长度为"+lengthOfLongestSubstring(s6));
}
public static int lengthOfLongestSubstring(String s){
int i=0,j=0,temp=0,result=0;
if (s.length()==0) return 0;
if (s.equals(" ")) return 1;
if (s.length()==1) return 1;
for(i=1;i<s.length();i++){
// System.out.println("i"+i+":"+s.charAt(i));
for (j=temp;j<s.length();j++){
if(i==j){
// System.out.println("当i==j退出时"+i+j);
break;
}
if(s.charAt(j)==s.charAt(i))
{
if(j!=i){
temp=j+1;
}
break;
}
// System.out.println("j"+j+":"+s.charAt(j));
}
if(result<i-temp+1){
result=i-temp+1;
}
// System.out.println();
}
return result;
}
}
上面的代码已经通过了LeetCode的测试,不得不说人家的测试用例果然还是比自己想的要周到,最开始都没考虑到空串、空格串的问题,以及我让i从1开始循环的情况把单字符串的情况也过滤掉了,所以函数里多了好些个if。当然人家有比我写得更好的,但是实话实说,我看不懂,我就觉得自己的好懂。
END