判斷字串中是否所有字元都只出現過一次

2021-08-18 18:34:55 字數 1416 閱讀 5529

參考:《程式設計師**面試指南 it名企演算法與資料結構題目最優解》

給定乙個字串s,判斷s中是否存在所有字元都出現過一次,根據以下兩種要求實現不同的函式。

要求一:實現時間複雜度為o(n)的方法

要求二:在保證額外空間複雜度為o(1)的前提下,請實現時間複雜度盡量低的方法。

要求一:時間複雜度為o(n)

遍歷一遍s,使用hashmap來記錄每種字元穿線的情況,那麼這樣就可以在遍歷時遍歷時發現字元重複出現的情況。

**實現如下:

public static boolean once(string s)

return

true;

}

要求二:保證額外空間複雜度為o(1),盡量降低時間複雜度。

要求空間複雜度o(1),基本思路是先將s進行排序,然後判斷排序後的字元是否存在重複情況,所以這裡複雜度便取決於排序演算法。任何時間複雜度為o(n)的演算法都是基於非比較的,其空間複雜度不可能為o(1);時間複雜度為o(nlogn)的排序演算法由歸併排序、快速排序、希爾排序和堆排序。歸併排序的基本思想是不斷將兩個已經排好序的小部分合成乙個大部分,在這個過程中需要輔助陣列才能完成,雖然歸併排序使用手搖演算法可以實現空間複雜度為o(1),但是最壞情況相愛時間複雜度會公升至o(n^2),快速排序的時間複雜度為o(logn);希爾排序的時間複雜度取決於步長的選擇。所以最終選擇堆排序,其可以實現空間複雜度為o(1)的情況下時間複雜度為o(nlogn)。

但是一般情況的堆排序實現過程都是基於遞迴時間的,因為遞迴撐撐中需要使用函式棧空間,導致堆排序的空間複雜度為o(logn),若想要實現其空間複雜度為o(1),需要使用非遞迴的方式實現堆排序。

**實現如下:

public

static boolean isunique(string s)

return

true;

}//非遞迴方式實現堆排序

public

static

void

heapsort(char c)

//交換根節點和葉子節點,並調整大頂堆

for(int i = len-1;i>-1;i--)

}//不斷將父親節點和其子節點進行比較,將大的節點和父親節點交換

private

static

void

adjustheap(char c,int p, int size) else

break;}}

private

static

void

swap(char c, int i, int j)

5 7判斷字元陣列中是否所有的字元都只出現過一次

題目 給定乙個字元型別chas,判斷chas中是否所有的字元都只出現過一次,請根據以下不同的兩種要求實現兩個函式。實現public boolean isunique char chas boolean map newboolean 256 for int i 0 i chas.length i ma...

判斷字元陣列中是否所有的字元都只出現過一次

要求 在保證額外空間複雜度為o 1 的前提下,使得時間複雜度最低 思路 先排序,再遍歷陣列 考點 各個排序演算法的時間,空間複雜度 堆排序 public boolean isunique char chas system.out.println 1 建堆 buildstack chas for in...

判斷字元陣列中是否所有的字元都只出現過一次

題目 給定乙個字元型別陣列chas,判斷chas中是否所有的字元都只出現過一次,請根據以下不同的兩種要求實現兩個函式。舉例 chas a b c 返回true chas 1 2 1 返回false。要求 1.實現時間複雜度為o n 的方法。2.在保證額外空間複雜度為o 1 的前提下,請實現時間複雜度...