2016-07-28 143 views
-7

使用java,输入string =“aabbcdeaaaabbb”并且输出必须是aaaa,因为这里的序列重复4次a。任何人都可以帮助我使用java实现获得这个“aaaa”作为输出。使用java,输入字符串=“aabbcdeaaaabbb”,输出必须是aaaa

查找重复相同字符的最长子字符串的算法。

为如:

I/P:aabbcdefaaaacccccc O/P:CCCCCC

请在下面检查我的计划,并提出任何优化,更快的处理:

public class LongestSubString { 
public static void main(String[] args) throws IOException { 

BufferedReader reader = new BufferedReader(new InputStreamReader(
     System.in)); 
System.out 
     .println("Enter a word to find longest substring with same characters repeated"); 
String word = reader.readLine(); 

System.out.println("Entered word is: " + word); 

System.out.println("Longest repeated characters substring is: " 
     + subStringFinder(word)); 

} 

/* 
*longest substring finder with same character repeated 
*/ 

public static String subStringFinder(String word) { 
char[] tokens = word.toCharArray(); 
int len = tokens.length; 
int wordLen = word.length(); 

System.out.println("len of input word: " + wordLen); 

List<String> myList = new ArrayList<>(); 
StringBuilder strConcat = new StringBuilder(""); 
for (int j = 0; j <= len - 1; j++) { 

    if (j + 1 > len - 1) { 
     if ((strConcat.length() >= 1) 
       && (strConcat.charAt(strConcat.length() - 1) == (tokens[j]))) { 
      strConcat.append("" + tokens[j]); 
      myList.add(strConcat.toString()); 
     } 
    } 

    else { 
     if (tokens[j] == tokens[j + 1]) { 
      if ((strConcat.length() >= 1) 
        && (strConcat.charAt(strConcat.length() - 1) == (tokens[j]))) { 
       strConcat.append("" + tokens[j]); 
       myList.add(strConcat.toString()); 
      } else { 
       strConcat = new StringBuilder(""); 
       strConcat.append("" + tokens[j]); 
      } 
     } else { 
      if ((strConcat.length() >= 1) 
        && (strConcat.charAt(strConcat.length() - 1) == (tokens[j]))) { 
       strConcat.append("" + tokens[j]); 
       myList.add(strConcat.toString()); 
      } else { 
       strConcat = new StringBuilder(""); 
       strConcat.append("" + tokens[j]); 
      } 
     } 
    } 
} 

int max = 0, index = 0; 
for (int i = 0; i < myList.size(); i++) { 
    String strEle = myList.get(i); 
    int strLen = strEle.length(); 

    if (max < strLen) { 
     max = strLen; 
     index = i; 
    } 

} 

return myList.get(index); 

} 
} 
+0

发布您的代码! –

+2

“aabbcdeaaaabbb”.substring(7,11) – ekaerovets

+0

@ekaerovets - 这只是我提供的一般示例字符串。我的问题是,在一个字符串中找到只有重复字符的最长的子字符串,在这种情况下,它的“aaaa”。 – Arafath

回答

0

我相信你的代码太复杂了。您不需要StringBuilder也不需要ArrayList。我试图理解你的意图,但是然后跳过它并改写我自己的版本。无论如何希望它有帮助。

public static String subStringFinder(String word) { 
    if (word == null || word.isEmpty()) { 
     return word; 
    } 
    char currentChar = word.charAt(0); 
    int longestStart = 0; 
    int longestLength = 0; 
    int currentStart = 0; 
    int currentLength = 1; 
    for (int ix = 1; ix < word.length(); ix++) { 
     if (word.charAt(ix) == currentChar) { 
      currentLength++; 
     } else { 
      if (currentLength > longestLength) { 
       longestStart = currentStart; 
       longestLength = currentLength; 
      } 
      currentChar = word.charAt(ix); 
      currentStart = ix; 
      currentLength = 1; 
     } 
    } 
    if (currentLength > longestLength) { 
     longestStart = currentStart; 
     longestLength = currentLength; 
    } 
    return word.substring(longestStart, longestStart + longestLength); 
} 
+0

谢谢,你的代码逻辑很好:) – Arafath

0
String in = "aabbcdeaaaabbb"; 
String t; 
ArrayList<String> out = new ArrayList<String>(); 
String l=""; 
int c=0; 
String n; 

    for(int i=0;i<in.length;i++) { 
    n=in.substring(i, i+1); //get the current character 
    if(n.equals(l)){ 
     l=n; c++; 
     } 
    else { 
     t=n; 
     for(int j=1;j<c;j++) { 
      n+=t; 
     } 
    c=0; 
    out.add(n); 
    c=0; 
    } 
} 
+0

我已经从答案的底部删除了无用的文本,并接受了您的重新格式化。你可以添加一些关于OP的问题的解释,以及你的代码如何修复它? –