public class SubSequeuesDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入target字符串...");
String targetStr = scanner.next();
System.out.println("请输入source字符串...");
String sourceStr = scanner.next();
scanner.close();
System.out.println("您的source字符串=" + sourceStr);
System.out.println("您的target字符串=" + targetStr);
char[] charArray = sourceStr.toCharArray();
// 生成char数组
// char[] charArray = "ffawabggacegcegergbegadfahehheeh".toCharArray();
// 转换目标char数组
char[] targetCharArray = targetStr.toCharArray();
// 记录上一次找到char的临时变量
int lastIndex = 0;
// 记录子序第一个的下标
int firstSourceIndex = 0;
// 记录子序最后一个的下标
int endSourceIndex = 0;
int targetLastIndex = targetCharArray.length - 1;
for (int targetIndex = targetLastIndex; targetIndex >= 0; targetIndex--) {
char tempTargetChar = targetCharArray[targetIndex];
// 从尾部开始遍历,减少循环次数
for (int sourceIndex = charArray.length - 1; sourceIndex >= 0; sourceIndex--) {
// 跳过已找到的,减少判断
if (sourceIndex > lastIndex && lastIndex != 0) {
continue;
}
char tempSourceChar = charArray[sourceIndex];
// 先找到最好一个,再利用当前循环开始找,最后一个c找到了
if (tempSourceChar == tempTargetChar && (lastIndex == 0 || sourceIndex <= lastIndex)) {
lastIndex = sourceIndex;
System.out.println("char=" + tempSourceChar + ",index=" + sourceIndex);
if (targetIndex == targetLastIndex) {
endSourceIndex = sourceIndex;
} else if (targetIndex == 0) {
firstSourceIndex = sourceIndex;
}
break;
}
}
}
System.out.println(firstSourceIndex);
System.out.println("最后序列开序下标=" + firstSourceIndex);
System.out.println("最后序列结束下标=" + endSourceIndex);
StringBuffer stringBuffer = new StringBuffer();
for (int i = firstSourceIndex; i <= endSourceIndex; i++) {
stringBuffer.append(charArray[i]);
}
System.out.println("最后序列串=" + stringBuffer.toString());
}
}
优化版本,修改source初始循环下标,达到节省循环的目的:
public static void main(String[] args) {
while(true) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入target字符串...");
String targetStr = scanner.next();
System.out.println("请输入source字符串...");
String sourceStr = scanner.next();
System.out.println("您的source字符串=" + sourceStr);
System.out.println("您的target字符串=" + targetStr);
printSubStrs(targetStr, sourceStr);
}
}
private static void printSubStrs(String targetStr, String sourceStr) {
char[] charArray = sourceStr.toCharArray();
// 生成char数组
// char[] charArray = "ffawabggacegcegergbegadfahehheeh".toCharArray();
// 转换目标char数组
char[] targetCharArray = targetStr.toCharArray();
// 记录上一次找到char的临时变量
int lastIndex = 0;
// 记录子序第一个的下标
int firstSourceIndex = 0;
// 记录子序最后一个的下标
int endSourceIndex = 0;
//下次循环从已找到的子串位置开始
int sourceLength = charArray.length - 1;
int targetLastIndex = targetCharArray.length - 1;
for (int targetIndex = targetLastIndex; targetIndex >= 0; targetIndex--) {
char tempTargetChar = targetCharArray[targetIndex];
// 从尾部开始遍历,减少循环次数
for (int sourceIndex = sourceLength; sourceIndex >= 0; sourceIndex--) {
// 跳过已找到的,减少判断
/*
* if (sourceIndex > lastIndex && lastIndex != 0) { continue; }
*/
char tempSourceChar = charArray[sourceIndex];
// 先找到最好一个,再利用当前循环开始找,最后一个c找到了
if (tempSourceChar == tempTargetChar && (lastIndex == 0 || sourceIndex <= lastIndex)) {
lastIndex = sourceIndex;
sourceLength = sourceIndex-1;
System.out.println("char=" + tempSourceChar + ",index=" + sourceIndex);
if (targetIndex == targetLastIndex) {
endSourceIndex = sourceIndex;
} else if (targetIndex == 0) {
firstSourceIndex = sourceIndex;
}
break;
}
}
}
System.out.println(firstSourceIndex);
System.out.println("最后序列开序下标=" + firstSourceIndex);
System.out.println("最后序列结束下标=" + endSourceIndex);
StringBuffer stringBuffer = new StringBuffer();
for (int i = firstSourceIndex; i <= endSourceIndex; i++) {
stringBuffer.append(charArray[i]);
}
System.out.println("最后序列串=" + stringBuffer.toString());
}