问题
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
即:给定一个字符串,找出它所有字串中,最长的,且该字串内无重复字母例如:
abcdef ==》 abcdef
abcabcbbb ==》 abc
dvdf ==》 vdf
解题思路
无重复字串,如果某个字串包含重复字符,那么直接不必考虑;
测试案例:abcabcbbb
1 初始化一个stringBuilder作为工作空间,一个String对象result保存中间步骤结果。
2 从字符串第一个字符开始,判断是否已经存在StringBuilder中;
3 如果不存在,将该判断位字符添加到StringBuilder;
4 如果已存在,判断是否需要导出StringBuilder到result,从重复字符开始裁剪StringBuilder;
- 例如:result="" StringBuilder=“abc”,下一个待判断的字母是’a’,StringBuilder包含它,导出StringBuilder到 -> result=“abc”,裁剪调字符串"a", 结果:StringBuilder=“bc” (同理,假如判断位是b,StringBuilder将b,以及b以前的字符串"ab"裁剪掉,裁剪结果为:“c” );
这是一个O(N) 时间算法,只需要把字符串s从头到尾遍历一次即可得到答案,个人觉得目前存在比明显的缺陷是StringBuilder的使用,它可能会导致内存消耗。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
String result = "";
String JUDGE;
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0;i < s.length();i++){
JUDGE = Objects.toString(s.charAt(i));
if(stringBuilder.indexOf(JUDGE) >= 0){
if(stringBuilder.length() > result.length())
result = stringBuilder.toString();
stringBuilder.delete(0,stringBuilder.indexOf(JUDGE) + 1);
}
stringBuilder.append(s.charAt(i));
}
if(stringBuilder.length() > result.length())
result = stringBuilder.toString();
return result.length();
}
}