我使用此问题检查了旧主题,无法修复它。
此方法用于比较两个字符串,如果第一个字符串的每个字母/字符都在第二个字符串中找到(反之亦然),则该方法应返回“true”(即使第二个字符串有额外的信件)。
我的想法是检查第一个字符串的每个索引处的字母,看它是否在第二个字符串中,如果是,则在两个字符串中删除该字母。当第一个字符串用完字母(长度等于零)时,布尔值应返回true。
我认为我的循环或子串在某些时候超出了范围。
public boolean isFound(String first, String second) {
StringBuilder sb1 = new StringBuilder(first);
StringBuilder sb2 = new StringBuilder(second);
first.toCharArray();
second.toCharArray();
for (int i = 0; i < first.length(); i++) {
int k = (first.substring(i, i + 1)).indexOf(second, i);
if (sb1.length() > 0) {
sb1.deleteCharAt(k);
sb2.deleteCharAt(k);
}
}
if (sb1.length() == 0) {
return true;
} else {
return false;
}
}
Ex:“at”和“tack”应该返回true,“tree”和“ere”应该返回false。
修改 在审核了评论之后,我的新代码现在就是这个。即使使用“树”和“树”,它总是返回false。
public boolean isFound(String first, String second){
StringBuilder sb2 = new StringBuilder(second);
for(int i=0;i<first.length();i++){
int k = sb2.indexOf(first,i);
if (k==-1)
return false;
else sb2.deleteCharAt(k);
}
return true;
}
答案 0 :(得分:4)
您的代码中存在许多问题。
second
toCharArray()
的调用是多余的first
中搜索second
的每个字符,而应搜索其sb2
的可变版本。indexOf
错误。应该在StringBuilder
对象上调用此方法来搜索第一个参数,并将其交换。您可以使用的伪代码是
isSuperAnagram(String first, String second) {
sb = StringBuilder(second)
for all chars in first {
k = search index of current char of first in sb
if(k == -1) // char is not in sb
return false
else
remove char at index k from sb
}
return true
}
答案 1 :(得分:1)
请查看您的算法和API的代码/用法
` first.toCharArray();`
second.toCharArray();
不会将第一个,第二个转换为数组,此API将返回一个字符数组。
(first.substring(i,i+1)).indexOf(second,i);
将在first.substring中搜索整个substring2。
检查算法/代码是否相应地更正。请注意所有边缘/角落情况。
理想的方法是使用hashmap。(在额外空间的成本上)
答案 2 :(得分:0)
您可以使用简单的逻辑将代码实现为
for(int i=0;i<sb1.length;i++)
{
for(int j=0;j<sb2.length;j++)
{
if(sb1.[i]==sb2.[j])
{
count++;
break;
}
if(count>=sb1.length)
{
System.out.print("match");
}
}
}
如果您想要更多条件,请将其发布在我的帖子下面,我只为您的后续示例撰写 例如:“at”和“tack”应该返回true,“tree”和“ere”应该返回false。