给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
自个儿写的二维数组动态规划代码:
/**
* TODO
*leetcode第三题动态规划解法
* @author Roy
* @date 2021/2/22 22:18
*/
class EveryDay3_1 {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0) return 0;
String dp[][] = new String[s.length()][s.length()];
for(int i=0;i<dp[0].length;i++) dp[0][i]=s.charAt(i)+"";
int max =1;
for(int i=1;i<dp.length;i++){
for(int j=0;j<dp[i].length-1;j++){
if(dp[i-1][j+1]!=null){
dp[i][j]=dp[i-1][j].substring(0,dp[i-1][j].length()-(i-1))+dp[i-1][j+1];
if(judgeRepeat(dp[i][j])==0&&max<dp[i][j].length()){
max = dp[i][j].length();
}
}
}
}
return max;
}
public int judgeRepeat(String s){
int zifu[]=new int[300];
for(int i=0;i<s.length();i++){
zifu[s.charAt(i)]++;
}
for(int i=0;i<zifu.length;i++){
if(zifu[i]>1){
return 1;//1有重复
}
}
return 0;//0无重复
}
}
参考题解写的滑动窗口写法:
import java.util.HashSet;
import java.util.Set;
/**
* TODO
* leetcode 每日一题第三题滑动窗口解法
@author Roy
* @date 2021/2/10 21:02
*/
public class EveryDay3 {
public static int lengthOflongestSubString(String s){
Set<Character> set = new HashSet<Character>();
int length = s.length();
int start = 0;
int end = -1;
int ans = 0;
for(int i=0;i<length;i++){
if(i!=0){
set.remove(s.charAt(i-1));
}
while(end+1<length&&!set.contains(s.charAt(end+1))){
set.add(s.charAt(end+1));
++end;
}
ans = Math.max(ans,end-i+1);
}
return ans;
}
public static void main(String[] args) {
lengthOflongestSubString("asdrfeadcvcssscdes");
}
}