【问题标题】:Given two strings in one input (separated by commas), how to find out if the permutation of string S1 is equal to the string S2 in Java?给定一个输入中的两个字符串(用逗号分隔),如何找出字符串 S1 的排列是否等于 Java 中的字符串 S2?
【发布时间】:2019-05-19 09:06:27
【问题描述】:

输入 - “sumitsu”

如何查找字符串中任何一个的排列是否与另一个匹配。如果我的方法是正确的,请在下面找到我的代码并帮助我。我还尝试使用 Arrays.sort 对字符串进行排序,但hackerEarth 编辑器不接受 Arrays.sort。有没有其他方法可以解决这个问题? TIA。

注意 - 这是hackerEarth 的两个字符串问题。

我已经拆分了输入的两个字符串数组。然后我将每个关键字转换为字符数组。使用 for 循环,我遍历 S1 中的每个关键字以匹配 S2 数组。

class TestClass {
public static void main(String args[] ) throws Exception {

    Scanner s = new Scanner(System.in);
    int cases=s.nextInt();

    for(int i=0;i<cases;i++){   //for multiple lines


        String name1=s.nextLine();
        String name2=s.nextLine();

        char[] n1=name1.toCharArray();
        char[] n2=name2.toCharArray();

        boolean match=false;

            for(int j=0;j<n1.length;j++){

                for(int k=0;k<n2.length;k++){

                    if(n1[j]==n2[k]){
                        match=true;
                        break;
                    }
                    else{
                        match=false;
                    }

                }
            }
        System.out.println(match);
    }
  }
}

输入 - majnu jamnu

预期 - 真 实际 - 错误

【问题讨论】:

    标签: java arrays string sorting java-io


    【解决方案1】:

    您的代码存在多个问题:

    1. 您可能在读取输入时遇到问题。如果您对测试的输入进行硬编码(即String name1="majnu"; String name2="jamnu";),您的程序将输出true。如果您尝试读取每个 StringnextLine(),即使它们输入在同一行中,这也不足为奇。

    2. 您不考虑多次出现同一字符。您的程序将为abbbbbaa 返回true

    3. 您的程序具有二次(即O(n^2))时间复杂度。如果您维护一个 HashMap 来计算第一个单词中每个字符的出现次数,并根据该 Map 检查第二个单词,则可以使用线性复杂度来完成。

    【讨论】:

    • 感谢您指出问题。对于第 1 点,我必须使用 split 方法来拆分输入并继续进行。对于第 2 点,我已经休息了;如果至少匹配一次,则退出循环。如果我错了,请告诉我。第 3 点 - 我不知道您提到的复杂类型,我将了解它并尝试在此处使用 Hashmap。
    • @HarishKannan 休息对你没有帮助。假设输入是“aaaaaa”和“a”。你会将第二个字符串的第一个也是唯一一个字符与第一个字符串的所有字符匹配,并错误地返回 true。
    • 是的,这种情况是可以接受的。我试图找出不匹配的字符。
    【解决方案2】:

    一行:

    String s1 = "majnu", s2 = "jamnu";
    Arrays.equals( s1.chars().sorted().toArray(), s2.chars().sorted().toArray() );  // <— true
    


    对于这项任务,显然是在寻找带有地图的解决方案:

    countMap 将 ASCII 码映射到相关的出现次数:*

    Function<String,Map<Integer, Integer>> countMap = (s) -> s.codePoints().boxed().collect(
        Collectors.toMap( Function.identity(), value -> 1, Integer::sum ) );
    

    *) 完美描述了类似的任务here

    countMap.apply( "majnu" ).equals( countMap.apply( "jamnu" ) ); // &lt;— true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多