首页 > 解决方案 > 查找两个字符串的交集,其中返回两个字符串中出现的字符(与第一个字符串的序列顺序相同)

问题描述

我正在使用 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:Hello 输入字符串 2:world 预期输出为:lo 我的代码生成的实际输出:ol

测试场景 2 - [反转 StringBuilder 后] 输入字符串 1:嗨,你很好 输入字符串 2:嗨 man 预期输出是:hi a 我的代码生成的实际输出:a ih

标签: javastringhashmaphashset

解决方案


最后,在@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;
    }

推荐阅读