[英]Remove Duplicates: Space Complexity for this Code
給定一個沒有空格的字符串,任務是從中刪除重復項。
注意:字符的原始順序必須保持不變。
例子:
Input: S = "zvvo"
Output: "zvo"
解釋:只保留第一次出現
我寫了下面的代碼,我想知道它的空間復雜度。
public class Solution {
public String removeDups(String s) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i< s.length(); i++){
String ch = Character.toString(s.charAt(i));
if (sb.indexOf(ch) == -1)
sb.append(ch);
}
return sb.toString();
}
}
您的解決方案的空間復雜度為O(n) ,因為它需要在內存中分配一個最多包含n
字符的StringBuilder
實例,並將其轉換為相同長度的String
。
這些內存成本很好,但您的解決方案的時間復雜度可以提高。 提供的代碼在O(n^2)中運行,因為方法indexOf()
在幕后對StringBuilder
實例中的字符執行迭代,並且正在為給定字符串中的每個字符調用它。
為了降低時間復雜度,您可以維護一個HashSet
,並將每個字符提供給 Set,如果該字符被拒絕,則意味着它之前遇到過。
以下是它的實現方式:
public String removeDups(String s) {
Set<Character> seen = new HashSet<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (seen.add(ch)) sb.append(ch);
}
return sb.toString();
}
盡管我們使用了一些額外的內存,但空間復雜度保持不變O(n) (因為在評估算法的復雜度時未考慮常量, 2*n
和3*n
將導致O(n) )。 時間復雜度是線性的O(n) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.