2011-04-17 44 views
2

我有一個字符串,並且想要將其反轉,以便某些字符得到反轉,而其他字符保持原位。我怎樣才能實現這一點(例如,讓我說所有的字母在所有的數字保持不變的情況下,我希望所有的字母都是相反的)在Java中反轉字符,同時保持一定的位置

+4

不能扭轉角色 - 可以扭轉一個字符串。給出一個樣本輸入/輸出。 – Erik 2011-04-17 08:35:18

+2

@Erik,'b'倒過來就是'd'。 – 2011-04-17 08:59:28

+0

@Erik,是的,你是對的。我的意思是像下面... – yydl 2011-04-17 09:05:11

回答

4

您可以爲它創建一個自動機:
遍歷字符串,將每個字母插入到堆棧中,並替換爲不在原始字符串中的特殊字符(即$),根本不要更改數字。
再次迭代字符串,將每個$替換爲堆棧的頭部。
注:由於字符串是不可變的,你需要首先將其導出到一個StringBuilder或CharSequence的
編輯
例如:

String inp = "a45string1test"; 
    char[] cs = new char[inp.length()]; 
    inp.getChars(0, inp.length(), cs, 0); 
    Stack<Character> stack = new Stack<Character>(); 
    for (int i =0;i<cs.length;i++) { 
     if (Character.isDigit(cs[i])) continue; 
     stack.push(cs[i]); 
     cs[i] = '$'; 
    } 
    for (int i=0;i<cs.length;i++) { 
     if (cs[i] == '$') cs[i] = stack.pop(); 
    } 
    System.out.println(cs); 

結果將是t45setgni1rtsa
複雜度爲O(n):迭代字符串(兩次) - 因爲所有堆棧操作都是O(1)。

4

這聽起來像你想像myReverse(「a1b2c3d」)是「d1c2b3a」。

使用兩個索引,一個從字符串的每一端開始尋找可交換字符。

下面是一些僞代碼:

i1 = 0; i2 = len - 1; 
while (i1 < i2) { 
    while (isCharacterThatShouldNotBeSwapped(str.charAt(i1)) && i1 < i2) 
    i1++; 
    while (isCharacterThatShouldNotBeSwapped(str.charAt(i2)) && i1 < i2) 
    i2--; 
    if (i1 < i2) 
    swapChars(str, i1, i2); /* swap characters at positions i1 and i2 in str */ 
    i1++; i2--; 
} 
相關問題