最长无重复子串
两种思路:一种是暴力解法
一种是动态规划
package merchant;
public class maxNoRepeat {
//设置record记录重复字符的位置,然后比较当前字符和重复字符之间的字符串有无重复,有重复就进行记录当前最大
//的子串,然后将重复字符的位置更新,继续向下进行比较
//比如字符串abcdaef,初始record=0,i=1,当当前字符i=4时,和record重复,此时最大的子串为abcd,
//更新record的位置为b所在位置
public static String maxsub1(String s)
{
if(s==null||"".equals(s)||s.length()==1)
{
return s;
}
int record=0,maxlen=1,index=0;
for(int i=1;i<s.length();i++)
{
int len=1;
for(int j=i-1;j>=record;j--)
{
if(s.charAt(i)==s.charAt(j)){//在j位置上出现了与当前字符串相等的字
record = j+1;
break;
}
else len++;
if(maxlen<len){
index = record;//最大子串开始的位置
maxlen = len;
}
}
}
return s.substring(index,index+maxlen);
}
//滑动窗口法
// public static String maxsub2(String s)
// {
// if(s==null||"".equals(s)||s.length()==1)
// {
// return s;
// }
//
// }
//动态规划,加入当前位置的最大的子字符串是str[i],则下一个位置的最大无重复子字符串有两种情况,1,当前字符未
//在str[i]中,则str[i+1] = str[i]+char[i+1];
//2.char[i+1]在str[i]中,则str[i+1]=在str[i]中重复元素的所在位置的下一个元素直到str[i]末尾+char[i+1]
//例如str[i]=“abcd”,char[i+1]="a",则str[i+1] = "bcd"+"a";
public static String maxsub2(String s)
{
if(s==null||"".equals(s)||s.length()==1)
{
return s;
}
char[] c = s.toCharArray();
int len = c.length;
String[] str = new String[len];
str[0] = c[0]+"";
for(int i=1;i<len;i++)
{
if(str[i-1].contains(c[i]+"")){
str[i] = str[i-1].substring(str[i-1].indexOf(c[i]+"")+1)+c[i]+"";
}else{
str[i] = str[i-1]+c[i];
}
}
int maxlen = 0;
int index = 0;
for(int i=0;i<len;i++)
{
if(str[i].length()>maxlen)
{
index = i;
maxlen = str[i].length();
}
}
return str[index];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abcdrfgabcffg";
String res1 = maxsub1(str);
String res2 = maxsub2(str);
System.out.println("暴力解法"+res1);
System.out.println("动态规划"+res2);
}
}