Java 如果给定的字母 1 不存在,如何打印 -1

Java How to print -1 if the given letter1 is not present

我想编写一个程序,从两个字符串 string1 和 string2 中获取字母位置,然后它会检查 string2 中我们使用相同字母的位置,还会打印索引数,如果没有字母那是在第一个字符串中只是打印 -1 。例如我有第一个字符串 = "reds" 第二个 = "Hello world!",那么我的输出应该是: r: 8, e: 1, d: 10, s: -1

这是我的代码:

    public static void main(String[] args){
        String set1 = "reds";
        String set2 = "Hello world!";
        for(int i = 0; i < set1.length(); i++)
        {
            for(int j = 0; j < set2.length();j++)
            {
            char currentChar = set1.charAt(i);
            char currentChar2 = set2.charAt(j);
            if(currentChar == currentChar2)
                {
                System.out.println(currentChar+": "+j);
                }
            }
        }
    }
}
  public static void main(String[] args){
    String set1 = "reds";
    String set2 = "Hello world!";
    for(int i = 0; i < set1.length(); i++) {        
        char currentChar = set1.charAt(i);
        boolean found = false;
        for(int j = 0; j < set2.length();j++) {            
            char currentChar2 = set2.charAt(j);
            if(currentChar == currentChar2) {                
                System.out.println(currentChar+": "+j);
                found = true;
            }
        }
        if(!found) {
            System.out.println(currentChar + ": -1");
        }
    }
}

另一种使用方式String.indexOf

经典for循环

String set1 = "reds";
String set2 = "Hello world!";
for(int i = 0; i < set1.length(); i++){
    System.out.println(set1.charAt(i) + " : " + set2.indexOf(set1.charAt(i)));
}

或流

set1.chars()
    .mapToObj(c -> (char)c + " : " + set2.indexOf(c))
    .forEach(System.out::println);

注意:如果字符在第二个字符串中出现多次,则打印字符的第一个索引(如果需要最后一个索引,请使用 lastIndexOf

它将set1字符的每个位置打印到set2中。

O(n + m)时间复杂度,其中n和m是set1和set2的大小

O(256) space 由于 ASCII 数字的复杂性

public static void main(String[] args){
    String set1 = "reds";
    String set2 = "Hello world!";

    Map<Integer, List<Integer>> map = new HashMap<>();  // key = ascii value of the char, value = list of indexes

    for(int i = 0; i < set2.length(); i++){
        int key = set2.charAt(i);

        if(!map.containsKey(key)){
            map.put(key, new ArrayList<>());
        }

        List<Integer> indexesList = map.get(key);
        indexesList.add(i);
        map.put(key, indexesList);
    }

    for(int i = 0; i < set1.length(); i++){
        int key = set1.charAt(i);

        System.out.print(set1.charAt(i) + ": ");

        if(!map.containsKey(key)){
            System.out.println(-1);
        }
        else {
            map.get(key).forEach(x-> System.out.print(x+ " "));
            System.out.println(); // just for new line
        }
    }
}