我和我有两个字符串:
s1="MICROSOFT"
s2="APPLESOFT"
我需要比较字符串并从第二个字符串中删除重复部分(总是朝向末尾)。所以我应该把“MICROSOFT”和“APPLE”作为输出。
我已逐字符地比较了两个字符串。
String s1 = "MICROSOFT";
String s2 = "APPLESOFT";
for(int j=0; j<s1.length(); j++)
{
char c1 = s1.charAt(j);
char c2 = s2.charAt(j);
if(c1==c2)
System.out.println("Match found!!!");
else
System.out.println("No match found!");
}
它应检查字符串,如果两个字符串在字符串结尾之前具有相同的字符,那么我需要从第二个字符串中删除该冗余部分,在本例中为SOFT。但我想不出如何从这里开始。
可能会有更多重复......但我们必须只删除那些持续相同的重复项。如果我有APPWWSOFT和APPLESOFT,我应该在第二个字符串中再次获得APPLE,因为我们在两者之间获得了与WW不同的LE
你能帮帮我吗?
答案 0 :(得分:4)
搜索并阅读最长公共子序列,您可以找到有效的算法来找出两个输入字符串的LCS。找到输入字符串的LCS后,很容易操作输入。例如,在您的情况下,LCS算法会将“SOFT”作为这两个字符串的LCS,然后您可以检查LCS是否在第二个输入的最后部分,然后轻松删除它。我希望这个想法有所帮助。
Java中的示例LCS代码在此处,请尝试:http://introcs.cs.princeton.edu/java/96optimization/LCS.java.html
示例场景(伪代码):
input1: "MISROSOFT";
input2: "APPLESOFT";
execute LCS(input1, input2);
store the result in lcs, now lcs = "SOFT";
iterate over the characters of input2,
if a character exists in lcs then remove it from input2.
答案 1 :(得分:2)
据我了解,您希望从两个字符串中删除任何相同的字符。相同的意思是:相同的位置和相同的字符(代码)。我认为以下线性复杂性解决方案是最简单的:
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder(); //if you want to remove the identical char
//only from one string you don't need the 2nd sb
char c;
for(int i = 0; i<Math.min(s1.length,s2.length);i++){
if((c = s1.charAt(i)) != s2.charAt(i)){
sb1.append(c);
}
}
return sb1.toString();
答案 2 :(得分:2)
尝试这个算法 - 创建第一个字符串的字符序列,并在第二个字符串中找到它。
表现 -
平均情况=(s1.length() - 1)sq
public class SeqFind {
public static String searchReplace(String s1,String s2) {
String s3;
boolean brk=false;
for(int j=s1.length();j>0&&!brk;j--){
for (int i = j-4; i > 0; i--) {
String string = s1.substring( i,j);
if(s2.contains(string)){
System.out.println(s2+" - "+string+" "+s2.replace( string,""));
brk=true;
break;
}
}
}
return s3;
}
public static void main(String[] args) {
String s1 = "MICROSOFT";
String s2 = "APPLESOFT";
String s3 = searchReplace(s1,s2);
}
}
输出 - APPLESOFT - SOFT - APPLE
答案 3 :(得分:1)
如果您希望修改StringBuffer
,则应该使用String
。
在这种情况下,你可以增加一个StringBuffer
,在其中你可以继续附加不匹配的字符: -
StringBuffer s1 = new StringBuffer("MICROSOFT");
StringBuffer s2 = new StringBuffer("APPLESOFT");
StringBuffer s3 = new StringBuffer();
for(int j=0; j<s1.length(); j++)
{
char c1 = s1.charAt(j);
char c2 = s2.charAt(j);
if(c1==c2) {
System.out.println("Match found!!!");
} else {
System.out.println("No match found!");
s3.append(c1);
}
}
s1 = s3;
System.out.println(s1); // Prints "MICRO"
答案 4 :(得分:1)
public class Match {
public static void main(String[] args)
{
String s1="MICROSOFT";
String s2="APPLESOFT";
String[] s=new String[10];
String s3;
int j=0,k=0;
for(int i=s2.length();i>0;i--)
{
s[j]=s2.substring(k,s2.length());
if(s1.contains(s[j]))
{
s3=s2.substring(0,j);
System.out.println(s1+""+s3);
System.exit(0);
}
else
{
System.out.println("");
}
j++;
k++;
}
}
}
我已经编辑了代码,你可以再试一次。
答案 5 :(得分:0)
尝试这个,没有经过测试
String s1 = "MICROSOFT";
String s2 = "APPLESOFT";
String s3="";
for(int j=0; j<s1.length(); j++)
{
if(s1.charAt(j)==s2.charAt(j)){
s3+=s1.charAt(j);
}
}
System.out.println(s1.replace(s3, " ") + " \n"+ s2.replace(s3, " "));
答案 6 :(得分:0)
我绞尽脑汁后解决了我的问题。请随时纠正/改进/优化我的代码。该代码不仅适用于“MICROSOFT”和“APPLESOFT”输入,还适用于“APPWWSOFT”和“APPLESOFT”之类的输入(我需要从上面的两个输入中删除连续重复项 - SOFT)。我正处于学习阶段,我将非常感谢任何有价值的投入。
public class test
{
public static void main(String[] args)
{
String s1 = "MICROSOFT";
String s2 = "APPLESOFT";
int counter1=0;
int counter2=0;
String[] test = new String[100];
test[0]="";
for(int j=0; j<s1.length(); j++)
{
char c1 = s1.charAt(j);
char c2 = s2.charAt(j);
if(c1==c2)
{
if(counter1==counter2)
{
//System.out.println("Match found!!!");
test[0]=test[0]+c2;
counter2++;
//System.out.println("Counter 2: "+counter2);
}
else
test[0]="";
}
else
{
//System.out.print("No match found!");
//System.out.println("Counter 2: "+counter2);
counter2=counter1+1;
test[0]="";
}
counter1++;
//System.out.println("Counter 1: "+counter1);
}
System.out.println(test[0]);
System.out.println(s2.replaceAll(test[0]," "));
}
}