/** 注意:如果一个函数有多个长度相等的不重复子串,本函数只能得到其中的第一个子串,
* 如果要输出所有子串,稍作修改即可
*/
public static String noDuplicate(String s) {
/**
* 这个函数返回给定字符串中最长不重复子串 采用类似纸牌游戏拖板车的思维
*/
String result = ""; // 记录最终结果,即最长子串
String sub = ""; // 记录当前纸牌串
for (int i = 1; i < s.length(); i++) { // 一张张发牌
String c = "" + s.charAt(i); // 当前新发下来的牌
if (!sub.contains(c)) { // 如果当前纸牌串中不包含新发的牌
sub += c; // 将新牌加入当前纸牌串
} else { // 如果当前纸牌串中包含新发的牌
if(result.length()<sub.length()){ //如果当前子串比最优记录长
result = sub; // 更新最优记录
}
String[] temp = sub.split(c); //将子串按当前牌分割为两部分
sub = temp[1]; // 取后一部分作新的当前纸牌串,丢弃重复牌及其前面部分
sub+=c; // 将新牌加入当前纸牌串
}
}
// 比较最后一个当前纸牌串与最优记录
if(result.length()<sub.length()){ //如果当前子串比最优记录长
result = sub; // 更新最优记录
}
return result;
}