2015-02-06 4 views
-3

그래서, 나는 주어진 문자열의 주어진 길이의 모든 가능한 단일 부분 문자열을 생성하는 법을 최근에 배웠다. 이제, 주어진 길이의 가능한 모든 DISTINCT 문자열을 찾으려고합니다. 그 의미는 문자열에 모든 별개의 문자가 있다는 것입니다. 명령은 중요하지 않습니다.구별되는 문자 자바의 주어진 문자열로부터 주어진 길이의 문자열

public static void distinctStrings(int maxLength, char [] alphabet, String news){ 
    //converts char array to a string builder so you can mutate it 
    String a = new String (alphabet); 
    StringBuilder nAlphabet = new StringBuilder(a); 
    //if it is max 
    if(news.length()==maxLength) System.out.println(news);//full.add(news); 
    //describes the way to get the distinct string: 
else{ 
//if alphabet.length>0 to avoid errors when the alphabet length has reached 0, probably could just do a while loop 
     if(alphabet.length>0){ 
      for(int i = 0; i < alphabet.length; i++) { 
       String oldCurr = news; 
       news += nAlphabet.charAt(i); 
//deletes char so it can't be used again 
       nAlphabet.deleteCharAt(i); 
       String c = nAlphabet.toString(); 
       char[] b = c.toCharArray(); 
//reprocesses the strings. 
       distinctStrings(maxLength,b,news); 
       news = oldCurr; 
     } 
    } 

} 

편집 : 지금까지 내가 무엇을 가지고 그래서 코드가 작동하지 않습니다, 나는 이유를 모르겠어요. "AB AB"를 출력하고 그게 전부입니다. 나는 distinctStrings (2, { 'A', 'B', 'C'}, "")로 실행했습니다. 나는 또한 그것을 최적화하는 방법에 대한 조언을 주시면 감사하겠습니다. 내가 코딩하기를 원하는 일반적인 생각은 distinctStrings (2, { 'A', 'B', 'C'}, '')를 연결하면 AB, AC, BC를 출력한다고 가정합니다. 명령은 중요하지 않아야합니다. 반면에 가능한 모든 문자열을 출력하고 싶다면 AA, BB 및 CC와 같은 문자열을 포함 할 것입니다. 별개의 문자열이라는 용어는 문자열에 포함 된 문자가 모두 다른 문자열을 의미합니다. "news"문자열 (시작 부분에 그냥 비어 있음)을 사용하는 이유는 시작 지점이므로 메서드를 자체적으로 실행할 수 있으며 새 문자열 "news"에 메서드를 실행하기 때문입니다.

+0

은 그냥'HashSet의 '에 모두 넣어. –

+0

특정 길이의 고유 한 문자열을 저장하기 위해 최적의 루프가 무엇인지 묻고 있습니까? –

+0

아니요, 코드가 작동하지 않습니다. 그것은 "AB AB"를 출력하고 그게 전부입니다. 나는 그것을 수정하고 아마도 그것을 최적화하는 방법을 요구하고있다. 지금은 비효율적입니다. 해시 셋 문자열이 무엇인지 찾아 볼 것입니다. 힌트를 가져 주셔서 감사합니다. – user4500882

답변

0

의도 한 내용입니까?

public static void distinctStrings(int maxLength, char[] alphabet, String news) { 
    // a set that will enforce only distinct words 
    Set<String> wordsDistinct = new HashSet<String>(); 

    // find all distinct words, of length maxLength 
    for (int i = 0; i < news.length() - maxLength; ++i) { 
     // possible a valid word 
     String word = news.substring(i, i + maxLength); 

     // validation test 
     boolean isValid = true; 
     for (char c: alphabet) { 
      if (word.contains(String.valueOf(c))) { 
       isValid = false; 
       break; 
      } 
     } 
     if (!isValid) 
      continue; // probably not valid, because of the alphabet, or maybe is vice-versa 

     // add the word to set. If already there ... the set will ignore it. 
     wordsDistinct.add(word); 
    } 

    // print the strings 
    for (String s : wordsDistinct) { 
     System.out.println(s); 
    } 
} 

나는 그것을 실행

DistinctStrings ds = new DistinctStrings(); 
    char a[] = {' ', ';'}; 
    ds.distinctStrings(4, a, "lorem ipsum dolor sit amet; lorem ipsum"); 

출력 :

psum 
dolo 
olor 
amet 
ipsu 
orem 
lore 
+0

아니, 나는 당신이 꽤 이해한다고 생각하지 않는다. 문자열이 주어지면 문자의 모든 가능한 뚜렷한 하위 문자열을 인쇄하는 등 내 코드를 사용하려고합니다. 나는 더 명확하게하기 위해 질문을 편집 할 것이다. – user4500882

+0

suct that char array, 미안. 귀하의 경우, 문자 배열은 "a"이므로 결과는 다음과 같아야합니다. "lorem ipsum dolor sit amet; lorem ipsum"끝에는 공백이 있고 세미콜론과 공백은 세미콜론이므로 단순히 초기 문자열을 가져 와서 가능한 모든 문자열에 문자 (char 배열에서 가져온 문자)를 추가합니다.이 문자는 단순히 공백과 세미콜론입니다. – user4500882