[英]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.