簡體   English   中英

刪除重復項:此代碼的空間復雜度

[英]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*n3*n將導致O(n) )。 時間復雜度是線性的O(n)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM