您的位置:首页 > 编程语言 > Java开发

leetcode第三题无重复字符的最长子串的java实现

2019-08-13 09:47 405 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/bulingbulinging/article/details/99408518

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public int lengthOfLongestSubstring(String s) {

}
}

一开始自己用的暴力寻找法,直接找到所有的子串然后判断他们是不是有重复字符

public int lengthOfLongestSubstring(String s) {
int ans=0;
int len=s.length();
for (int i=0;i<len;i++){
for (int j=i+1;j<=len;j++){
if (allunique(s,i,j))
ans=Math.max(ans,j-i);
}
}
return ans;
}
public boolean allunique(String str,int start,int end){
Set<Character> map=new HashSet<>();
for (int i=start;i<end;i++){
if(map.contains(str.charAt(i)))
return false;
map.add(str.charAt(i));
}
return true;
}

结果运行时间过长了

于是看了官方的解题思路,有个“滑动窗口”的办法,一看感觉很像KMP,借助了HashSet结构,不得不说java的哈希图的运用是真的广泛

public int lengthOfLongestSubstring(String s) {
int len=s.length();
Set<Character>  map=new HashSet<>();
int i=0;
int j=0;
int ans=0;
while (i<len&&j<len){
if(!map.contains(s.charAt(j))){
map.add(s.charAt(j++));
ans=Math.max(ans,j-i);
}else {
map.remove(s.charAt(i++));
}
}
return ans;
}

附上测试用的主方法代码

public static void main(String[] args) {
Solution solution=new Solution();
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
System.out.println(solution.lengthOfLongestSubstring(string));
}

2019-08-13

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: