原题
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
思路1
- 双指针+HashSet
- 一个指针为
i
、一个指针为j
- 当不是重复的字符,放进set并且
i++
;res记录最大长度 - 此时子串为
S
- 当遇到j指向的字符放不进去,就删掉子串
S
中前面的字符并且i++
,直到j
指向的字符能放进去 - 时间复杂度 O(2n)
代码1
package offer;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
* 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 */public class offer48 {
public static void main(String[] args) {
Scanner scc=new Scanner(System.in);
String s=scc.next();
System.out.println(new Solution48().lengthOfLongestSubstring(s));
}
}
class Solution48 {
public int lengthOfLongestSubstring(String s) {
int n=s.length();
Set<Character> set =new HashSet<>();
int res =0,i=0,j=0;
while(i<n&&j<n) {
if(!set.contains(s.charAt(j))) {//当不是重复的字符,放进set并且i++;res记录最大长度
set.add(s.charAt(j++));
res=Math.max(res, j-i);
}
else {
set.remove(s.charAt(i++));//当遇到j指向的字符放不进去,就删掉前面的字符并且i++,直到指向的字符能放进去
}
}
return res;
}
}
思路2
- 使用动态规划和hashmap
- 思路1在关键上是迭代寻找重复字符首次出现,可以使用hashmap来找,<String,Integer>,发现重复时就更新value,省去了i的从前往后遍历
代码2
看官方题解
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。