import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Stack;
public class Test {
//调整栈
//如果栈为空,则将s压入栈
//由于栈中存放的是最长相同子串(可能有多个长度相同的子串,而它们的内容也可能相同,例如"asd","123","asd")
//如果栈顶元素长度小于s的长度,则将stack清空,将s压入栈
//如果栈顶元素长度等于s的长度,不清空stack,将s压入栈
//如果栈顶元素长度大于s的长度,则不做任何操作
public static void modifyStack(Stack<String> stack,String s){
if(stack.empty() == true)
stack.push(s);
else{
String topStr = stack.peek();
if(topStr.length() < s.length()){
stack.clear();
stack.push(s);
}
if(topStr.length() == s.length())
stack.push(s);
}
}
//s1.charAt(i) == s2.charAt(j) 之后从它们的下标开始查找最长子串
public static void startSearchLongestSubString(String s1,String s2,Stack<String> stack,int i,int j){
int i1 = i+1;
int j1 = j+1;
while (i1 < s1.length() && j1 < s2.length()){
if(s1.charAt(i1) == s2.charAt(j1)){
i1++;
j1++;
if(i1 == s1.length()){
String subStr = s1.substring(i,i1);
modifyStack(stack,subStr);
}
if(j1 == s2.length()){
String subStr = s2.substring(j,j1);
modifyStack(stack,subStr);
}
}
else{
String subStr = s1.substring(i,i1);
modifyStack(stack,subStr);
break;
}
}
}
//打印最长相同子串
public static void printLongestSubString(Stack<String> stack){
Set<String> set = new HashSet<>();
if(stack.empty())
System.out.println("给定的两字符串中没有相同子串");
else{
System.out.println("给定的两字符串中最长相同子串如下:");
//将可能存在的重复字符串去除
while (stack.empty() == false)
set.add(stack.pop());
Iterator it = set.iterator();
while (it.hasNext())
System.out.println(it.next());
}
}
public static void main(String[] args){
String s1 = "123asdert";
String s2 = "45612sderdert";
Stack<String> stack = new Stack<>();
for(int i = 0 ; i < s1.length() ; i++)
for(int j = 0 ; j < s2.length() ; j++)
if(s1.charAt(i) == s2.charAt(j))
startSearchLongestSubString(s1,s2,stack,i,j);
printLongestSubString(stack);
}
}
求给定两字符串的最长相同子串
最新推荐文章于 2023-04-15 20:24:33 发布