2011-05-11 123 views
4

我需要帮助来确定如何从字符串中删除重复字符。它必须完成递归这是真正的问题..从字符串中递归删除重复字符

public class FEQ2 { 
    /** 
    * @param args 
    */ 
    public static void removeDups(String s, int firstChar, int secondChar) {  
     if (s.length() == 1) { 
      System.out.println(s); 
     }   
     char a = s.charAt(firstChar); 
     if (a == s.charAt(secondChar)) { 
      s = a + s.substring(secondChar + 1); 
     } 
     System.out.println(s); 
     removeDups(s, firstChar + 1, secondChar + 1); 
     //return s; 
    } 

    public static void main(String[] args) { 
     //System.out.println(removeDups("AAAABBARRRCC", 1)); 
     removeDups("AAAABBARRRCC", 0 , 1); 
    } 
} 
+0

这是从家庭作业吗?如果是这样,你能否复制确切的问题? – 2011-05-11 02:48:25

+0

你能说什么是预期的结果? ABARC或ABRC?如果它是作业 - 是否有限制,使用什么和不是什么? – 2011-05-11 03:20:08

回答

4

你可以这样说:

public static String removeDups(String s) 
{ 
    if (s.length() <= 1) return s; 
    if(s.substring(1,2).equals(s.substring(0,1))) return removeDups(s.substring(1)); 
    else return s.substring(0,1) + removeDups(s.substring(1)); 
} 


INPUT: "AAAABBARRRCC" 
OUTPUT: "ABARC" 

===============

编辑:另一种方式

public static String removeDups(String s) 
{ 
    if (s.length() <= 1) return s; 
    if(s.substring(1).contains(s.substring(0,1))) return removeDups(s.substring(1)); 
    else return s.substring(0,1) + removeDups(s.substring(1)); 
} 


INPUT: "AAAABBARRRCC" 
OUTPUT: "BARC" 

==============

编辑:3的方式

public static String removeDups(String s) 
{ 
    if (s.length() <= 1) return s; 
    if(s.substring(0,s.length()-1).contains(s.substring(s.length()-1,s.length()))) return removeDups(s.substring(0,s.length()-1)); 
    else return removeDups(s.substring(0,s.length()-1)) + s.substring(s.length()-1,s.length()); 
} 


INPUT: "AAAABBARRRCC" 
OUTPUT: "ABRC" 
+0

提供家庭作业问题的解决方案是否明智?他们会学什么? – 2011-05-11 03:45:29

+0

嗯,它没有被标记为家庭作业,当我回答它 – 2011-05-11 03:55:56

+0

不适用于 - >“azxxzy”应该给 - >“ay” – AnujKu 2014-03-05 22:34:47

1

递归做事的一般技巧是把所有的变量,并把它们变成参数,并改变所有分配到函数调用。您可能需要不止一个功能更复杂的东西,但通常你可以把每个循环为tail-recursive功能很容易:

function(){ 
    int i=0; int x=0; //initialize 
    while(condition){ 
     x = x+i; //update 
     i = i+1; 
    } 
    return x; 
} 

成为

function(i,x){ //variables are now parameters 
    if(condition){ 
     return x; 
    }else{ 
     return function(i+1, x+i); //update 
    } 
} 

main(){ 
    function(0,0); //initialize 

======== =======

下面是一些重复删除代码,只是举例(它doesn't做同样的事情,你虽然)

removeDuplicates(str): 
    i = str.length-1; out_str = ""; chars_used = [] 
    while(i >= 0): 
     c = str[i] 
     if(c not in chars_used): 
      chars_used.append(c) 
      out_str += c 
     i -= 1 
    return out_str 

成为

remove_duplicates(str, i, out_str, chars_used): 
    if i < 0: 
     return out_str 
    else: 
     c = str[i] 
     if c in chars_used: 
      return remove_duplicates(str, i-1, out_str, chars_used) 
     else: 
      return remove_duplicates(str, i-1, out_str+c, chars_used+[c]) 
0

这能否帮助你?

public static String getUniqueChars(String realString) { 
     StringBuilder resultString = null; 
     try { 
       List<Character> characterArray = new <Character> ArrayList(); 
       for(char c : realString.toCharArray()) { 
        characterArray.add(c); 
       } 
       resultString = new StringBuilder(); 
       for(Character c : new TreeSet<Character>(characterArray)) { 
        resultString.append(c.charValue()); 
       } 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } 
     resultString.toString(); 
    } 
0
private static String removeChars(String s) { 
    int n= s.length(); 
    int i= 0; 
    int j= 1; 
    Map<Integer, Boolean> mark= new HashMap<>(); 
    while(j<n) { 
     if(s.charAt(i)== s.charAt(j)) { 
      mark.put(i, true); 
      mark.put(j, true); 
      if(i== 0) { 
       i= j+1; 
       j= i+1; 
      } else { 
       i= i-1; 
       j= j+1; 
      } 
     } else { 
      i= j; 
      j= j+1; 
     } 
    } 

    String str= ""; 
    for(int k= 0;k<n;k++) { 
     if(!mark.containsKey(k)) { 
      str+= s.charAt(k); 
     } 
    } 
    return str; 
}