Java程序在给定字符串中查找第一个非重复字符

时间:2020-01-09 10:35:33  来源:igfitidea点击:

这篇文章展示了在Java中找到给定String中第一个非重复字符的方法。例如,如果给定的字符串为" abcdcab",则第一个非重复字符为d。

有很多选择可以编写Java程序来查找给定String中的第一个非重复字符的选项,其中一些如下。

  • 使用LinkedHashMap
  • 使用String类的indexOf()方法
  • 无需使用任何内置的Java方法,即可编写自己的逻辑。

使用LinkedHashMap查找第一个非重复字符

在使用LinkedHashMap的解决方案中,我们可以按字符迭代String字符,并将其作为(键,值)对存储在映射中,其中character是键,其计数是value。对于每个字符,请检查LinkedHashMap中的密钥是否已存在;如果存在,则增加其计数;否则将其存储为1.
一旦所有字符都存储在映射中,则迭代映射以查找值为1的第一个键。这将是第一个非重复字符。这里使用LinkedHashMap是因为它维护了插入顺序,如果我们需要String中的第一个非重复字符,该顺序将有所帮助。

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

public class NonRepeatedChar {
  public static void main(String[] args) {
    String str = "abcdcab";
    Map<Character, Integer> charMap = storeInMap(str);
    char c = findCharInMap(charMap);
    if(c != ' '){
      System.out.println("First non repeated char in "+ str + " is " + c);
    }
  }
	
  private static Map<Character, Integer> storeInMap(String str){
    Map<Character, Integer> charMap = new LinkedHashMap<Character, Integer>();

    for(int i = 0; i < str.length(); i++){
      Character c = str.charAt(i);			
      if(charMap.containsKey(c)){
        charMap.put(c, charMap.get(c) + 1);
      }else{
          charMap.put(c, 1);
      }
    }
    return charMap;
  }
	
  private static char findCharInMap(Map<Character, Integer> charMap){
    for(Entry<Character, Integer> entry : charMap.entrySet()){
      // Find first char with count 1
      if(entry.getValue() == 1){
        return entry.getKey();
      }
    }
    return ' ';
  }
}

输出:

First non repeated char in abcdcab is d

使用indexOf()方法查找第一个非重复字符

我们还可以使用String类的indexOf()和lastIndexOf()方法来查找给定String中的第一个非重复字符。由于indexOf()返回给定字符第一次出现的索引,而lastIndexOf()返回String中给定字符最后一次出现的索引,因此两个方法返回的索引相等的字符将是第一个非重复字符。

public class NonRepeatedChar {
  public static void main(String[] args) {
    String str = "juju";
    findUsingIndex(str);
    findUsingIndex("jejune");
  }
	
  private static void findUsingIndex(String str){
    Character c = null;
    boolean flag = false;
    for(int i = 0; i < str.length(); i++){
      c = str.charAt(i);
      if(str.indexOf(c) == str.lastIndexOf(c)){
        flag = true;
        break;
      }
    }
    if(flag){
      System.out.println("First non repeated char in "+ str + " is " + c);
    }else{
      System.out.println("non repeated char not found in "+ str);
    }
  }
}

输出:

non repeated char not found in juju
First non repeated char in jejune is u

在不使用任何内置Java方法的情况下查找第一个非重复字符

如果要求我们在任何采访中不使用任何内置Java方法来解决此问题,则可以使用给定的逻辑。

在外部循环中,我们将逐个字符地迭代字符串,在内部for循环中,我们将再次对String进行迭代,并将外部循环中的字符与字符串的所有字符进行比较。如果找到匹配项,则表示该字符重复,如果找不到该字符,则该字符为非重复字符。

public class NonRepeatedChar {
  public static void main(String[] args) {
    String str = "juju";
    findNonRepeated(str);
    findNonRepeated("jejune");
  }
	
  private static void findNonRepeated(String str){
    //Character c = null;
    boolean foundFlag = false;
    for(int i = 0; i < str.length(); i++){ 
      foundFlag = true;
      char c = str.charAt(i);
      for(int j = 0; j < str.length(); j++){
        // If similar char found, also check for the same index  
        if(c == str.charAt(j) && j != i){
          foundFlag = false;
          break; // inner for loop
        }
      }
      if(foundFlag){
        System.out.println("First non repeated char in "+ str + " is " + c);
        break; // outer for loop
      }
    }
    if(!foundFlag){
      System.out.println("non repeated char not found in "+ str);
    }
  }
}

输出:

non repeated char not found in juju
First non repeated char in jejune is u