题目要求:
输入一个字符串(只包含a~z的字符),求其最长不含重复字符的子字符串的长度。例如对于arabcacfr,最长不含重复字符的子字符串为acfr,长度为4。
解题思路:
动态规划。用dp[]记录状态,dp[i]表示以下标为i的字符结尾不包含重复字符的最长子字符串长度。初始化dp[0] = 1,求maxdp。每次可以根据dp的前一个状态推导出后一个状态。
import java.util.Arrays;
import java.util.Collections;
//最长不含重复字符的子字符串
public class Try93 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(longestSubstringWithoutDup("arabcacfr"));
System.out.println(longestSubstringWithoutDup("abcdefaaa"));
}
public static int longestSubstringWithoutDup(String str){
if(str==null || str.length()==0)
return 0;
//dp数组可以省略,因为只需记录前一位置的dp值即可
Integer[] dp = new Integer[str.length()];
dp[0] = 1;
System.out.print(dp[0]+" ");
int ju;
for(int i=1;i<str.length();i++){
ju=0;
for(int j=i-1;j>-1;j--){
if(str.charAt(j)==str.charAt(i)){
ju=i-j;
break;
}
}
if(ju==0||ju>dp[i-1]){
dp[i]=dp[i-1]+1;
}
else{
dp[i]=ju;
}
System.out.print(dp[i]+" ");
}
System.out.println();
int max=(int) Collections.max(Arrays.asList(dp));
return max;
}
}