第一個只出現一次的字符

題目描述:java

在一個字符串(0<=字符串長度<=10000,所有由字母組成)中找到第一個只出現一次的字符,並返回它的位置, 若是沒有則返回-1(須要區分大小寫).數組

思路分析:
方法一:
我的思路
比較粗暴,將字符串轉換成字符數組,按順序遍歷字符數組。須要兩個指針,指針1指向首次出現的字符,指針2從指針1的位置日後遍歷,找出與指針1相同的字符。
1,新建一個HashSet集合,用於存儲已經重複出現的字符;
2,先判斷指針位置上的元素是否包含在重複字符的集合中,若是重複指針1直接跳到下一個位置。繼續2過程。
3,若元素沒有包含在Set集合中,則指針2從指針1位置依次日後遍歷,判斷是否有相同的字符出現,如有相同的元素出現,則將該元素存入Set集合中,指針1指向下一個元素。繼續用2過程。
4,若指針2到達字符數組末尾時還未發現重複字符,則直接返回指針1位置的字符便可。
5,若遍歷完整個數組都沒找出出現一次的字符,則返回-1;指針

代碼實現以下:code

import java.util.HashSet;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if(str == null || str.length()< 1){
            return -1;
        }
        char[] ch = str.toCharArray();
        HashSet<Character> set = new HashSet<Character>();
        for(int i = 0 ; i < str.length()-1; i++){
            for(int j = i+1 ; j < ch.length;j++){
                if(set.contains(ch[i])){
                    break;
                }
                if(ch[i]==ch[j]){
                    set.add(ch[i]);
                    break;
                }
                if(j==ch.length-1){
                    return i;
                }
            }
        }
        return -1;
    }
}


方法2:
參考牛客網上大佬的思路:
連接:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c
來源:牛客網
說一下解題思路哈,其實主要仍是hash,利用每一個字母的ASCII碼做hash來做爲數組的index。首先用一個58長度的數組來存儲每一個字母出現的次數,爲何是58呢,主要是因爲A-Z對應的ASCII碼爲65-90,a-z對應的ASCII碼值爲97-122,而每一個字母的index=int(word)-65,好比g=103-65=38,而數組中具體記錄的內容是該字母出現的次數,最終遍歷一遍字符串,找出第一個數組內容爲1的字母就能夠了,時間複雜度爲O(n)字符串

代碼實現以下:hash

public class Solution {
    public int FirstNotRepeatingChar(String str) {
         int[] words = new int[58];
         for(int i = 0;i<str.length();i++){
            words[((int)str.charAt(i))-65] += 1;
         }
         for(int i=0;i<str.length();i++){
             if(words[((int)str.charAt(i))-65]==1)
                  return i;
         }
         return -1;
    }
}
相關文章
相關標籤/搜索