給定一個字符串,求第一個不重複的字符

題目

給定一個字符串,求第一個不重複的字符。例子:abbcdca 答案:d

如果用暴力解法,時間複雜度必然爲O(n2) ,而要達到O(n) ,關鍵就是,利用所有字符的ASCII碼都是在0~255之間,聲明一個標記數組存放字符串的信息。

方法一:當字符串可以重複訪問的時候,標記數組存放的是每個字符出現的次數。代碼如下:

import java.util.Scanner;

/**
 * 給定一個字符串,求第一個不重複的字符    abbcad -> c
 * @author 木小草
 *
 */
public class Test01 {
    public static void main(String[] args) {
        String tag = new String();
        Scanner scanner = new Scanner(System.in);
        tag = scanner.nextLine();
        int[] flag = new int[256];
        for (int i = 0; i < flag.length; i++) {
            flag[i] = 0;
        }
        for (int i = 0; i < tag.length(); i++) {
            flag[tag.charAt(i)]++;
        }
        for (int i = 0; i < tag.length(); i++) {
            if (flag[tag.charAt(i)] == 1) {
                System.out.println(String.valueOf(tag.charAt(i)));
                break;
            }
        }
    }
}

方法二:當字符串是流水字符串的時候,也就是字符串只能訪問一次的時候,我們的標數組就應該保存字符串的小標了。代碼如下:

import java.util.Scanner;

/**
 * 給定一個字符串,求第一個不重複的字符    abbcad -> c
 * @author 木小草
 *
 */
public class Test02 {
    public static void main(String[] args) {
        String tag = new String();
        Scanner scanner = new Scanner(System.in);
        tag = scanner.nextLine();
        int[] flag = new int[256];
        for (int i = 0; i < flag.length; i++) {
            flag[i] = -1;
        }
        for (int i = 0; i < tag.length(); i++) {
            int index = tag.charAt(i);
            if (flag[index]  >= 0) {
                flag[index] = -2;
            }else if(flag[index] == -1){
                flag[index] = i;
            }
        }
        int min = 256;
        for (int i = 0; i < flag.length; i++) {
            if (flag[i] < 0) {
                continue;
            }
            if (min > flag[i]) {
                min = flag[i];
            }
        }
        System.out.println(tag.charAt(min));
    }
}

注意:轉載請標明,轉自itboy-木小草
尊重原創,尊重技術。

發佈了29 篇原創文章 · 獲贊 18 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章