找到两个字符串的交集,返回两个字符串中出现的字符(与第一个字符串相同的顺序)

时间:2019-08-24 15:57:06

标签: java string hashmap hashset

我正在使用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

2 个答案:

答案 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;
    }
相关问题