求无重复字符串的最长字符串
题目是这样的:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
举几个例子:
例1:
输入:“abcdcc”
输出:4
理由: 这个字符串中最长无重复的是“abcd”,长度为4
例2:
输入:“sadnasdyss”
输出:6
理由: 这个字符串中最长无重复的是“nasdy”,长度为5
解题思路
这题目,顾名思义,就是找到给定字符串中不重复的最长子串,返回其长度。看到这,我首先想到了就是用2个for循环去做,找到其中最大的那个字符串、然后返回长度。(暴力法)可这个时间复杂度为O(n^2),应该是有优化空间的。就在想,如何去优化呢?
后来,我想到了可以通过HashSet中字段不从复的特性。想到了一种新的解法:平移法。这大大减少了其的时间复杂度。
简单说一下。循环一次。每次循环往set集合中存入char字符,如果遇到重复的字符便返回,把set集合的大小记录下来。最终返回一个最大的长度,次长度为最优解。
话不多说,上代码
解法一:暴力法(时间复杂度为O(n^2))
class Demo1{
public int maxLength(String s) {
int count =0;//记录最长的值
char[] chars = s.toCharArray();
if(chars.length==1){//字符串大小为1,就直接返回。
return 1;
}
for (int i = 0; i < chars.length-1; i++) {//遍历
int counts=1;
HashSet<String> hashSet=new HashSet<String>();
hashSet.add(chars[i]+"");
int size=hashSet.size();
for (int j = i+1; j < chars.length; j++) {
hashSet.add(chars[j]+"");
if(hashSet.size()==size){
break;
}else {
size=hashSet.size();
counts++;
}
}
if(counts>count){
count=counts;
}
}
return count;
}
}
解法二:平移法(时间复杂度:O(n))
class Demo2{
public int maxLength(String s) {
int left = 0;//定义指正,作用于指向字符串长度
int right = 0;
int max = 0;//最大值
Set<Character> set = new HashSet<Character>();
while (right < s.length()) {
if (set.contains(s.charAt(right))) {//set中是否包含相同的字符
set.remove(s.charAt(left++));
} else {
set.add(s.charAt(right++));//往set中添加字符
if(set.size()>max){//判断字符串的长度
max=set.size();
}
}
}
return max;
}
}
第一次写博客,各位多多关照,有不好的地方提出来,大家一起进步。