【题目描述】
给定一个字符串 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 由英文字母、数字、符号和空格组成
【解题代码】
package string;public class LengthOfLongestSubstring {public static void main(String[] args) {String s = "abcabcbb";int result = new LengthOfLongestSubstring().lengthOfLongestSubstring(s);System.out.println(result);}public int lengthOfLongestSubstring(String s) {int i = 0;int max = 0;StringBuilder sb = new StringBuilder(s);String subString = "";while (i < sb.length()){char ch = sb.charAt(i);int inx = subString.indexOf(ch);if (inx != -1) {if (max < subString.length()) max = subString.length();subString = subString.substring(inx + 1);}subString += ch;i++;}if (max < subString.length()) max = subString.length();return max;}
}
【解题思路】
根据题目描述和对示例进行分析,感觉这一题可以通过“滑动窗口”的算法进行处理,即定义两个索引值i1,i2,i1,i2从0开始,i2向后滑动,判断当前子字符串是否有重复字符,如果没有不断更新最大长度值,如果有的话,将i1设置为与最后一个字符重复的字符下一个索引值。按照这个思路,完成代码编写,并提交LeetCode成功
【解题步骤】
- 定义变量
int i = 0; int max = 0; StringBuilder sb = new StringBuilder(s); String subString = "";
- 从0开始,向后滑动获取当前字符,一直到字符串结尾为止
while (i < sb.length()){char ch = sb.charAt(i);
- 判断当前字符如果在子字符串中,那么当前计算当前子字符串长度,并更新长度最大值比较,然后重新调整下一个子字符串的开始索引
int inx = subString.indexOf(ch); if (inx != -1) {if (max < subString.length()) max = subString.length();subString = subString.substring(inx + 1); }
- 当前子字符串加上当前字符,并将自增滑动索引值
subString += ch; i++;
- 循环结束后,将当前子字符串和最大值进行比较更新,并返回最大值
if (max < subString.length()) max = subString.length(); return max;
【思考总结】
- 这道题的关键是“滑动窗口”的算法实现思路,不断向后滑动寻找合理的无重复字符子串,并刷新长度最大值;
- 程序员对于字符串的操作,一定能非常精熟;
- LeetCode解题之前,一定不要看题解,看了就“破功”了!