我是 Java 新手,我試圖弄清楚如何計算給定字串中的 Characters 并將兩個字符 "eu"的組合視為一個字符,并且仍然將所有其他字符視為一個字符。
我想使用遞回來做到這一點。
考慮以下示例。
輸入:
"geugeu"
期望的輸出:
4 // g eu g eu = 4
電流輸出:
2
我一直在嘗試很多,但似乎仍然無法弄清楚如何正確實施它。
我的代碼:
public static int recursionCount(String str) {
if (str.length() == 1) {
return 0;
}
else {
String ch = str.substring(0, 2);
if (ch.equals("eu") {
return 1 recursionCount(str.substring(1));
}
else {
return recursionCount(str.substring(1));
}
}
}
uj5u.com熱心網友回復:
OP 想要計算字串中的所有字符,但相鄰的字符“ae”、“oe”、“ue”和“eu”應該被視為單個字符并且只計算一次。
下面的代碼做到了:
public static int recursionCount(String str) {
int n;
n = str.length();
if(n <= 1) {
return n; // return 1 if one character left or 0 if empty string.
}
else {
String ch = str.substring(0, 2);
if(ch.equals("ae") || ch.equals("oe") || ch.equals("ue") || ch.equals("eu")) {
// consider as one character and skip next character
return 1 recursionCount(str.substring(2));
}
else {
// don't skip next character
return 1 recursionCount(str.substring(1));
}
}
}
uj5u.com熱心網友回復:
遞回解釋
為了使用Recursion解決特定任務,您需要深入了解遞回的作業原理。
您需要記住的第一件事是,每個 遞回解決方案都應該(顯式或隱式)包含兩部分:基本案例和遞回案例。
讓我們仔細看看它們:
基本情況- 表示簡單邊緣情況(或一組邊緣情況)的部分,即遞回應該終止的情況。這些邊緣情況的結果是預先知道的。對于這個任務,基本情況是給定的字串是空的,因為沒有什么可以計算的,所以回傳值應該是
0。這足以讓演算法作業,其他輸入的結果應該從遞回案例中得出。遞回案例- 是進行遞回呼叫和主要邏輯所在的方法的一部分。每個遞回呼叫最終都會達到基本情況并建立其回傳值。
在遞回的情況下,我們需要檢查給定的字串是否從一個特定的字串開始,比如"eu". 為此,我們不需要生成子字串(請記住,創建物件是有代價的)。相反,我們可以使用方法String.startsWith()來檢查提供的前綴字串的位元組是否與該字串開頭的位元組匹配,該字串是 Chipper (提醒:從 Java 9 開始, String 由位元組陣列支持,并且每個字符都用一個表示或兩個位元組,具體取決于字符編碼),我們也不關心字串的長度,因為如果字串比前綴短,startsWith()則會回傳false。
執行
也就是說,這是一個實作的樣子:
public static int recursionCount(String str) {
if(str.isEmpty()) {
return 0;
}
return str.startsWith("eu") ?
1 recursionCount(str.substring(2)) : 1 recursionCount(str.substring(1));
}
注意:除了能夠實作解決方案之外,您還需要評估它的時間和空間復雜度。
在這種情況下,因為我們正在創建一個新字串,每次呼叫時間復雜度都是二次O(n^2)(提醒:創建新字串需要將記憶體分配給原始字串的對應位元組)。更糟糕的情況空間復雜度也將是O(n^2)。
有一種方法可以在線性時間O(n)內遞回地解決這個問題,而無需在每次呼叫時生成一個新字串。為此,我們需要引入第二個引數 - current index,并且每個遞回呼叫都應該通過或通過(我不打算實作這個解決方案并將它作為一個練習來為 OP/reader 生活)推進這個索引。12
此外
此外,這是一個簡潔的非遞回解決方案,使用String.replace():
public static int count(String str) {
return str.replace("eu", "_").length();
}
如果您需要處理多個字符組合(在問題的第一個版本中列出),您可以使用正則運算式String.replaceAll():
public static int count(String str) {
return str.replaceAll("ue|au|oe|eu", "_").length();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507824.html
上一篇:計算物件內嵌套陣列的最高級別
下一篇:Java遞回索引超出范圍1
