簡體   English   中英

回文算法的時空復雜度

[英]Time and Space Complexity of Palindrome Algorithm

以下代碼在 Java 中尋找回文的時間和空間復雜度是多少:

    public static boolean isPalindrome(String str) {
        return str.equals(new StringBuilder(str).reverse().toString());
    }

我知道 reverse() 是 O(n)。 toString() 也是 O(n)。 等於也是 O(n)。 這是否意味着這段代碼是 O(n)?

至於空間復雜度,需要創建一個StringBuilder。 我不確定它被轉換成字符串后會發生什么。 Java 是否為轉換為字符串的 StringBuilder 分配空間,然后忘記 StringBuilder(允許它被垃圾收集器拾取)?

謝謝!

- - - - - 編輯 - - - - - - -

我想知道更多關於調用 isPalindrome 后在堆棧上創建的內容。 與說相比,它在空間方面的效率如何

謝謝。 我仍然不太了解這段代碼在空間方面的效率如何? 究竟將在堆棧上創建什么,以及它的效率(在空間方面)與,比方說,

public boolean palindrome2(String str) {    
        int n = str.length();
        for( int i = 0; i < n/2; i++ )
            if (str.charAt(i) != str.charAt(n-i-1)) return false;
        return true;    
}

假設所有這些運算實際上都是O(n),我想您是對的:O(n)+ O(n)+ O(n)= 3 * O(n)(或O(3n),如果您願意),則屬於O(n)類別。

StringBuilder -創建一個匿名實例,在方法isPalindrome結束后,由於該對象的作用域僅是此方法的本地對象,因此沒有對該對象的引用。 所以是的,它最終將由垃圾收集器處理。 最有可能不是立即,但我認為這與您無關。

public static boolean isPalindrome(String argument){    
    //remove special character    
    String done = argument.trim().replaceAll("[^a-zA-Z]+", " ");   
    //remove white spaces   
    String result = done.replaceAll("\\s", "");   
    //assign result string to argument   
    argument = result;   
    //convert string to a char then into a List of Charaters
    ArrayList<Character> characterList = (ArrayList<Character>) result.chars().mapToObj(c -> (char)c).collect(Collectors.toList());     
    //Using Collections reverse character List   
    Collections.reverse(characterList);
    //convert reversed List int a String    
    String reversedStr  = characterList.stream().map(String::valueOf).collect(Collectors.joining());   
    //Compare argument with reversedStr then return true or false   
    if(argument.equalsIgnoreCase(reversedStr))   
        return true;       
 public static boolean isPalindrome(String argument){
        //remove special character
        String done = argument.trim().replaceAll("[^a-zA-Z]+", " ");
        //remove white spaces
        String result = done.replaceAll("\\s", "");
        //assign result string to argument
        argument = result;
        //convert string to a char then into a List of Charaters
        ArrayList<Character> characterList = (ArrayList<Character>) result.chars().mapToObj(c -> (char)c).collect(Collectors.toList());
        //Using Collections reverse character List
        Collections.reverse(characterList);
        //convert reversed List int a String 
        String reversedStr  = characterList.stream().map(String::valueOf).collect(Collectors.joining());
        //Compare argument with reversedStr then return true or false
        if(argument.equalsIgnoreCase(reversedStr))
            return true;
        
        return false;
    }
    return false;   
}

暫無
暫無

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

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