我正在使用HashMap()解决此问题,但是在输出中字符的顺序和出现方面遇到了问题。
在迭代过程中以及创建StringBuilder之后,我都试图反转String构建器,但仍然面临另一个问题。
int l1 = inputStr1.length();
int l2 = inputStr2.length();
StringBuilder mkr = new StringBuilder();
HashMap<Character, Integer> res = new HashMap<>();
for (int i = 0; i < l1; i++) {
res.put(inputStr1.charAt(i),i);
}
for (int j = 0; j < l2; j++) {
if (res.containsKey(inputStr2.charAt(j))){
mkr.append(inputStr2.charAt(j));
}
}
mkr = mkr.reverse(); // Code only used in Test Scenario - 2
String result = mkr.toString();
if(result == null){return null;}
return result;
测试方案1- 输入字符串1:您好 输入字符串2:世界 预期输出为:lo 我的代码生成的实际输出:ol
测试方案2-[反转StringBuilder之后] 输入字符串1:您好 输入字符串2:嗨 预期输出为:hi a 我的代码生成的实际输出:ih
答案 0 :(得分:0)
您的方法似乎是正确的。但是,由于您期望最终的交集字符与输入的字符串1保持顺序,而不是为字符串1创建字符的哈希图,并在字符串2上进行迭代,如果这些操作相反,它将为您提供预期的答案。但这可能会返回重复项。例如,如果inputString1 ='apple'和inputString2 ='pot',则此方法可能返回两个p而不是1。为避免此问题,可以在哈希映射与inputString1中的字符匹配后将其从哈希图中删除。
int l1 = inputStr1.length();
int l2 = inputStr2.length();
StringBuilder mkr = new StringBuilder();
HashMap<Character, Integer> res = new HashMap<>();
for (int i = 0; i < l2; i++) {
res.put(inputStr2.charAt(i),i);
}
for (int j = 0; j < l1; j++) {
if (res.containsKey(inputStr1.charAt(j))){
res.remove(inputStr1.charAt(j));
mkr.append(inputStr1.charAt(j);
}
}
String result = mkr.toString();
if(result == null){return null;}
return result;
答案 1 :(得分:0)
最后,在@askipop的帮助下找到了解决方案:
if(inputStr1 == null || inputStr2 == null){
return null;
}
String res = "";
HashMap<Character, Integer> hm = new HashMap<>();
for(int i = 0; i < inputStr2.length(); i++){
Character c = inputStr2.charAt(i);
if(hm.containsKey(c)){
hm.put(c, hm.get(c) + 1);
} else{
hm.put(c, 1);
}
}
for(int i = 0; i < inputStr1.length(); i++){
Character ch = inputStr1.charAt(i);
if(hm.containsKey(ch)){
res += ch;
int c = hm.get(ch);
if (c - 1 > 0){
hm.put(ch, c - 1);
} else{
hm.remove(ch);
}
}
}
if(res.length() > 0){
return res;
}
return null;
}