题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解答:
简单的采用动态规划的思想,使用dp[i]来记录从s.charAt(0)到s.charAt(i)这段字符串中的最大的无重复字符的最长字串,当遍历到第i个字符的时候,在向前查找的时候,采用HashSet来储存已经出现过的字符,判断是否出现了重复的字符,如果是则可以直接跳出了,否则继续向前查找。
跳出之后,比较dp[i-1]与HashSet中元素的个数大小,取较大的即可。
代码如下:
import org.junit.Test;
import java.util.HashSet;
/**
* @Author: Dunfu Peng
* @Date: 2019/4/12 14:49
*/
public class Solution {
@Test
public void test(){
int res=lengthOfLongestSubstring("pwwkew");
System.out.println(res);
}
//动态规划 dp[i]=Max(dp[i-1],dp[i])
public int lengthOfLongestSubstring(String s) {
int len=s.length();
if (len==1){
return 1;
}
int[] dp=new int[len+1];
dp[0]=1;
for (int i = 1; i <len ; i++) {
dp[i]=1;
int count=1;
HashSet<Character> set=new HashSet<>();
set.add(s.charAt(i));
for (int j = i-1; j >=0 ; j--) {
if (!set.contains(s.charAt(j))){
set.add(s.charAt(j));
count++;
}else{
break;
}
}
dp[i]=Math.max(count,dp[i-1]);
}
return dp[len-1];
}
}
欢迎关注我的微信公众号,接收最新动态。

1186

被折叠的 条评论
为什么被折叠?



