【问题标题】:Find the intersection of two strings in which characters appearing in both strings are returned (same sequence order as 1st String)查找两个字符串的交集,其中返回两个字符串中出现的字符(与第一个字符串的序列顺序相同)
【发布时间】:2023-03-06 18:38:02
【问题描述】:

我正在使用 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 我的代码生成的实际输出:a ih

【问题讨论】:

标签: java string hashmap hashset


【解决方案1】:

您的方法似乎是正确的。但是,由于您期望最终的交集字符与输入字符串 1 一致,而不是为字符串 1 创建字符的哈希图并迭代字符串 2,如果这些操作被反转,它将给您预期的答案。但这可能会返回重复项。例如,如果 inputString1 = 'apple' 和 inputString2 = 'pot',则此方法可能返回两个 p 而不是 1。为避免此问题,您可以在与 inputString1 中的字符匹配后从 hashmap 中删除该字符。

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;

【讨论】:

  • 感谢您的评论。根据提供的测试用例,repitition 很好。输出应仅包含 - > 字符串 2 上出现的字符数,按字符串 1 的顺序排列。示例测试用例:我尝试通过在 String2 上创建 HashMap 并迭代 String1 来运行代码,但发现了以下问题。输入字符串 1:Hello 输入字符串 2:世界 预期输出为:lo 我的新代码生成的实际输出:llo
  • 感谢您的宝贵意见。根据问题陈述,重复是可以的。输出应仅包含 - > 字符串 2 上出现的字符数,按字符串 1 的顺序排列。在 HashMap 上启用 remove() 的示例测试用例: 输入 1:mmm 输入 2:mmm 预期输出为:mmm 实际输出:m 在通过在 String2 上创建 HashMap 并在没有 remove() 的情况下迭代 String1 运行代码后,在结果下方找到:输入字符串 1 : Hello 输入字符串 2 : world 预期输出是: lo 实际输出: llo 你能就这个问题提出建议吗?
  • 你对 string1:lol 和 string2:lllollll 有什么期望。是lllollll还是lllllllo?
【解决方案2】:

终于在@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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2012-10-15
    • 2011-11-20
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多