2012-02-12 2 views
0

나는 두 번 나타나는 문자열의 모든 문자를 삭제해야하는 인코딩 프로그램을 수행하고 있습니다. 나는 문자열을 통과하려고 시도했지만 작동하지 않았습니다. 아무도 이것을하는 방법을 아는가? 감사.문자열에서 문자 찾기

+0

시도를 게시 할 수 있으며 해결 방법을 알려 드리겠습니다. – dasblinkenlight

+0

거기에 내가 편집했습니다 –

+0

첫째, 왜 당신은 알파벳을 추가하고 있습니까? 또한 문자열의 양쪽 끝에서 동시에 반복합니다. i가 증가함에 따라, j는 감소한다. 그래서 하나의 인스턴스가 문자열 앞에서 멀어지면 다른 인스턴스는 뒤쪽에서부터 복제본을 찾습니다. 셋째,'j'는'newword.length()'대신'newword.length() - 1'에서 시작해야합니다; 그렇지 않으면'newword.charAt (j)'의 첫 번째 호출은'String'의 끝 부분을 보려고 할 것입니다. 이 세 가지 문제를 해결하십시오. 아직도 붙어 있다면 다시 게시하십시오. –

답변

2

는 문자의 첫 번째 발생을 유지하고자한다고 가정하면, 당신은이 작업을 수행 할 수 있습니다

boolean seen[65536]; 
StringBuilder res = new StringBuilder(); 
str = str.toUpperCase(); 
for (char c : str.toCharArray()) { 
    if (!seen[c]) res.append(c); 
    seen[c] = true; 
} 
return res.toString(); 

seen 배열 플래그, 캐릭터 당 하나를 포함, 우리는 이미이 문자를 본 적이 있음을 나타내는 . 문자가 모두 ASCII 인 경우 seen 배열을 128으로 축소 할 수 있습니다.

+0

조금 더 간단 할 수있는'BitSet'을 사용할 것입니다. Meh. –

0

그래서 표시된 코드에서 문자열의 모든 문자를 비교하지 않는 것처럼 보입니다. 첫 번째와 마지막을 비교 한 다음 두 번째와 마지막을 비교합니다. 예 :

여기에 귀하의 문자열입니다 : THISISTHESTRINGSTRINGABCDEFGHIJKLMNOPQRSTUVWXYZ

첫 번째 반복, 당신이 처음에 T를 비교되며, 마지막에 Z가. I 및 X 등

그래서 T a를 시작 결코 얻을 수있는 문자의 나머지 부분에 비해 : 두 번째 반복, 당신은 H와 셋째 Y. 비교됩니다.

int length = newword.length(); // This way the number of iterations doesn't change 

for(i = 0; i < length; i++){ 
    for(j = 0; j < length; j++){ 
     if(i!=j){ 
     if(newword.charAt(i) == newword.charAt(j)){ 
      newword.replace(newword.charAt(i), ' '); 
     } 
     } 
    } 
} 

나는 그게 가장 효율적인 알고리즘이 아니다 확신 있지만 그것을 완수해야

나는이 할 수있는 더 나은 방법이 루프 더블을 할하는 것입니다 생각합니다.

EDIT : i == j 케이스를 처리하기 위해 중간에 if 문을 추가했습니다.

편집이 다시 : 여기에 거의 동일한 포스트 : 두 번 표시 삭제 문자를 말함으로써 function to remove duplicate characters in a string

+0

이것이 작동하지 않는 것처럼 보입니다.'i == j' 알고리즘에서는 알고리즘이 같은 문자라고 생각할 것입니다. – dasblinkenlight

+0

감사합니다. 그걸 몰랐어. 나는 그 사건에 대한 수표를 추가했다. – dkniffin

1

가정하면, 코드가 당신을 위해 작동합니다 아래 AAABB는 AAA됩니다 의미한다. 이 코드의

static String removeDuplicate(String s) { 
    StringBuilder newString = new StringBuilder(); 
    for (int i = 0; i < s.length(); i++) { 
     String s1 = s.substring(i, i + 1); 
     // We need deep copy of original String. 
     String s2 = new String(s); 
     // Difference in size in two Strings gives you the number of 
     // occurences of that character. 
     if(s.length() - s2.replaceAll(s1, "").length() != 2) 
      newString.append(s1); 
    } 
    return newString.toString(); 
} 

효율성은 논란의 여지가있다 : 루프에 의해 캐릭터의 발행 수의 수를 계산하기 위해 더 나은 방법이 될 수 있습니다.