Java演算法面試題(004) 實現一個演算法來確定一個字串是否具有所有唯一的字元
問題分析
你應該首先詢問面試官,需要處理的字串是一個ASCII字串還是一個Unicode字串。提出這個問題將展現你對細節的考慮和你堅實的電腦科學基礎。為了簡單起見,我們將假設字串為ASCII型別。
一種解決方案是建立一個布林值陣列,其中位於索引i的標誌指示字元i是否包含在字串中。你第二次看到這個標識,你可以立即返回false。如果字串長度超過了唯一字元的數量,我們也可以立即返回false。
演算法
具體的演算法實現如下:
public boolean isUniqueChars(String str) {
if (str.length() > 128) {
return false;
}
boolean[] charSet = new boolean[128];
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i);
if (charSet[val]) { // already found this char in string
return false;
}
charSet[val] = true;
}
return true;
}
這個程式碼的時間複雜度是O(n),其中n是字串的長度。我們可以通過使用位向量來將我們的空間使用減少八倍。我們將假設,在下面的程式碼中,該字串只使用小寫字母a到z。
/*
* We can reduce our space usage by a factor of eight by using a bit vector.
* We will assume, in the below code, that the string only uses the
* lowercase letters a through z. This will allow us to use just a single
* int.
*/
public boolean isUniqueChars(String str) {
int checker = 0;
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i) - 'a';
if ((checker & (1 << val)) > 0) {
return false;
}
checker |= (1 << val);
}
return true;
}
進一步的問題
上面的演算法,個人認為都是比較典型的以空間換時間的思路。如果我們不能使用額外的資料結構,可以考慮下面的演算法實現:
1. 將字串的每個字元與字串的每個其他字元進行比較。這將花費O(n2)時間和O(1)空間。
2. 如果允許修改輸入字串,我們可以在O(n log(n))時間內對字串進行排序,然後再檢查相鄰字串是否相同。
演算法擴充
接下來,我們來擴充一下本文中使用的演算法,來檢查兩個字串是否具有相同的字元數(permutation)。我們也可以使用排列的定義 - 具有相同字元數的兩個詞來實現這個演算法。我們只是迭代這個程式碼,計算每個字元出現的次數。之後,我們比較兩個陣列。
public boolean permutation(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] letters = new int[128];
char[] s_array = s.toCharArray();
for (char c : s_array) {
letters[c]++;
}
for (int i = 0; i < t.length(); i++) {
int c = (int) toString().charAt(i);
letters[c]--;
if (letters[c] < 0) {
return false;
}
}
return true;
}
相關文章
- 如何確定一個字串中是否所有字元全部互不相同字串字元
- 如何唯一確定一個 Java 類?Java
- Java演算法面試題(003) 如何檢查一個字串是另外一個字串的旋轉字串Java演算法面試題字串
- LeetCode初級演算法之字串:387 字串中的第一個唯一字元LeetCode演算法字串字元
- 演算法-First Unique Character in a String-字串中的第一個唯一字元演算法字串字元
- 面試題目:手寫一個LRU演算法實現面試題演算法
- 387. 字串中的第一個唯一字元字串字元
- LeetCode 387. 字串中的第一個唯一字元 (Java)LeetCode字串字元Java
- 力扣題解-387. 字串中的第一個唯一字元力扣字串字元
- LeetCode 每日一題「判定字元是否唯一」LeetCode每日一題字元
- leedcode-字串中的第一個唯一字元字串字元
- PHP 判斷一個字元是否在字串中PHP字元字串
- 判斷字串是否唯一字串
- LeetCode-387-字串中的第一個唯一字元LeetCode字串字元
- 【leetcode 簡單】 第九十題 字串中的第一個唯一字元LeetCode字串字元
- 常見面試演算法題JS實現-設計一個有getMin功能的棧面試演算法JS
- Java使用雪花演算法實現生成全域性唯一idJava演算法
- 獲取一個字串中出現最多的字元和他的個數字串字元
- 一個快速、高效的Levenshtein演算法實現演算法
- 將字串每一個單詞第一個字元設定為大寫字串字元
- 判斷某一個字串是否存在另一個字串中字串
- js 字串中取得第一個字元和最後一個字元JS字串字元
- 一個自己研究出來的字串匹配演算法-k子串演算法字串匹配演算法
- 如何實現一個 Virtual DOM 演算法演算法
- . 【JAVA】給定任意 字串"yekmaakkccekymbvb",求出字串中有多少種字元,以及每個字元的個數?Java字串字元
- 面試題,實現一個求和函式面試題函式
- java面試一日一題:如何判斷一個物件是否為垃圾物件Java面試物件
- [劍指Offer]面試題35:第一個只出現一次的字元面試題字元
- css如何設定字串中第一個字元的樣式CSS字串字元
- 一個字串中某一個字元第n次出現的位置的函式字串字元函式
- 實現一個簡單的DOM diff演算法演算法
- 實現一個簡單的輪詢演算法演算法
- Java的整個字串的結束索引在最後一個字元之外Java字串索引字元
- 判斷一個字串是否包含一個子串的方法字串
- 演算法面試題:一演算法面試題
- 第一個只出現一次的字元——Java字元Java
- java實現字元壓縮演算法Java字元演算法
- 面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面面試演算法陣列