比较java中的字符串并删除字符串中相同的部分
我有两条线:比较java中的字符串并删除字符串中相同的部分,java,algorithm,Java,Algorithm,我有两条线: s1="MICROSOFT" s2="APPLESOFT" 我需要比较字符串,并从第二个字符串中删除重复部分(始终朝向末尾)。所以我应该把“微软”和“苹果”作为输出 我已经逐个字符比较了这两个字符串 String s1 = "MICROSOFT"; String s2 = "APPLESOFT"; for(int j=0; j<s1.length(); j++)
s1="MICROSOFT"
s2="APPLESOFT"
我需要比较字符串,并从第二个字符串中删除重复部分(始终朝向末尾)。所以我应该把“微软”和“苹果”作为输出
我已经逐个字符比较了这两个字符串
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!");
}
String s1=“微软”;
字符串s2=“APPLESOFT”;
对于(int j=0;j试试这个,不要测试你
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, " "));
String s1=“微软”;
字符串s2=“APPLESOFT”;
字符串s3=“”;
对于(int j=0;j搜索并阅读最长公共子序列,您可以找到有效的算法来找出两个输入字符串的LCS。找到输入字符串的LCS后,很容易操作输入。例如,在您的情况下,LCS算法将找到“软”作为这两个字符串的LCS,您可以检查LCS是否在第二个输入的最后部分,然后轻松地删除它。我希望这个想法有帮助
下面是Java中的LCS代码示例,请尝试:
示例场景(伪代码):
如果希望修改字符串
,则应使用StringBuffer
在这种情况下,您可以有一个额外的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"
StringBuffer s1=新的StringBuffer(“微软”);
StringBuffer s2=新的StringBuffer(“APPLESOFT”);
StringBuffer s3=新的StringBuffer();
对于(int j=0;j,据我所知,您希望从两个字符串中删除任何相同的字符。相同的意思是:相同的位置和相同的字符(代码)。我认为以下线性复杂度解决方案是最简单的:
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();
StringBuilder sb1=新的StringBuilder();
StringBuilder sb2=new StringBuilder();//如果要删除相同的字符
//仅从一个字符串中,您不需要第二个sb
字符c;
对于(inti=0;i尝试此算法-创建第一个字符串的字符序列,并在第二个字符串中找到它
性能-
平均案例=(s1.length()-1)sq
发出-
苹果软苹果
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++;
}
}
}
我已经编辑了代码,您可以再试一次。我绞尽脑汁解决了问题。请随时更正/改进/完善我的代码。该代码不仅适用于“MICROSOFT”和“APPLESOFT”输入,也适用于“APPWWSOFT”和“APPLESOFT”等输入(我需要从上述两种输入中的end-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]," "));
}
}
公共类测试
{
公共静态void main(字符串[]args)
{
字符串s1=“MICROSOFT”;
字符串s2=“APPLESOFT”;
int计数器1=0;
int计数器2=0;
字符串[]测试=新字符串[100];
测试[0]=“”;
对于(int j=0;jc)重复部分是在字符串中的任何位置还是始终在末尾?例如,您可能希望从“MICSOFTRO”和“APPSOFTLE”中删除“SOFT”?还会有更多的重复项吗?像APPAPPLESOFT和APPMICROSOFT应该删除APP和SOFT?而且,重复项只能是一个字符?或者总是超过1个字符?我想这个问题不应该得到这么多的赞成票。@GauravOjha你是在问第二个字符串与第一个字符串的差异吗?如果是,这个问题应该得到否定票nd关闭。@猫:它总是在黑暗中end@Th0rndike:是的,可以有更多的副本…但我们必须只删除那些连续相同的。如果我有APPWWSOFT和AppeSoft,我应该在第二个字符串中再次获得APPLE,因为我们在betwen中得到了与WW不同的LE。我想你的意思是!=
,而不是=
,而你on不需要替换。如果字符不在一起,替换将不起作用。@PeterLawrey我比较字符,如果字符相等,则将其附加到s3。正如我所说的未测试:P@Chaitanya..如果您试图追加..,那么StirngBuffer
将是一个更好的选择。。(您可以附加不匹配的字符,而不是附加匹配的字符。。将从replace
code]中拯救您。)@RohitJain是的,性能方面。但我只在示例中展示了:P@chaitanya10..我明白……我只是在我认为应该引用的时候引用了……)他想从2个字符串中删除任何类似的字符。因此,我认为不能应用最长的公共子序列…只有反复应用它…请检查-此代码(以及OP)不会在“MICROSOFT”和“APPLESOFT”中找到/删除任何内容 pair@GermannArlington..此代码没有从MICROSOFT
或APPLESOFT
中删除任何内容。但它正在创建一个新的StringBuffer
非匹配字符..该字符稍后分配给原始s3'..它将打印OP想要的
MICRO`非匹配字符..它不会打印任何有用的内容(比赛)对于我的两个给定字符串。请尝试一下。很抱歉,您正在谈论的是哪个strings
?..OP不希望匹配的字符串,他想删除它们..因此,我使用了这种方法..我欢迎您对代码的任何改进提出建议..因此,OP想从第二个字符串中删除任何?子字符串?they不想删除字符串的匹配部分?您的代码将找不到任何匹配项,无法删除我在第一条评论中建议的两个字符串:“MICROSOFT”和“APPLESOFT”。您的代码将打印“MICROSOFT”(完整word,不删除任何内容)因为你只做位置匹配,当s1比s2长时,它也会爆炸。你需要更多建设性的建议吗?谢谢你的回答。如果我理解正确,这个算法就是在两个字符串之间找到第一个匹配模式,然后从第二个字符串中删除它。对吗?这几乎就是我想要的,bu
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++;
}
}
}
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]," "));
}
}