查找两个字符串的交集,其中返回出现在两个字符串中的字符(与第一个字符串的顺序相同)
Find the intersection of two strings in which characters appearing in both strings are returned (same sequence order as 1st String)
我正在使用 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:world
预期输出是:lo
我的代码生成的实际输出:ol
测试场景 2 - [反转 StringBuilder 之后]
输入字符串 1:嗨,你很好
输入字符串 2:嗨,伙计
预期输出是:你好
我的代码生成的实际输出:a ih
看来你的做法是正确的。但是由于您希望最终的交集字符与输入字符串 1 一致,而不是为字符串 1 创建字符哈希图并迭代字符串 2,如果这些操作被逆转,它会给您预期的答案。但这可能 return 重复。例如,如果 inputString1 = 'apple' 和 inputString2 = 'pot',此方法可能 return 两个 p 而不是 1。为避免此问题,您可以从 hashmap 中删除与匹配的字符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;
最后,在@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;
}
我正在使用 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:world 预期输出是:lo 我的代码生成的实际输出:ol
测试场景 2 - [反转 StringBuilder 之后] 输入字符串 1:嗨,你很好 输入字符串 2:嗨,伙计 预期输出是:你好 我的代码生成的实际输出:a ih
看来你的做法是正确的。但是由于您希望最终的交集字符与输入字符串 1 一致,而不是为字符串 1 创建字符哈希图并迭代字符串 2,如果这些操作被逆转,它会给您预期的答案。但这可能 return 重复。例如,如果 inputString1 = 'apple' 和 inputString2 = 'pot',此方法可能 return 两个 p 而不是 1。为避免此问题,您可以从 hashmap 中删除与匹配的字符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;
最后,在@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;
}