[アルゴリズム-Javaの実装]文字列内の重複する文字を削除する
1.問題の説明:
1.入力:文字列文字列strを入力します。
2.出力:この文字列strの繰り返される文字を削除し、文字が表示される順序に従って、この繰り返されない文字列の結果を出力します。
といった:
入力: "hkdhkdhkd"出力: "hkd"
入力: "abbbcccd"出力: "abcd"
入力: "wxhxy"出力: "wxhy"
2.質問の回答:
1.まず、上記の入力と出力のケースによれば、出力結果文字列resultの長さは固定されておらず、入力文字列strに依存することがわかっているため、結果はStringBuffer string sb(長さ)に格納する必要があります。可変バッファ文字列)。
2.2。アイデア:判断のためにstrの各文字を取り出す必要があるため、forループが文字列を順番にトラバースするため、str.charAt(int index)メソッドを使用して各文字cを取り出す必要があります。質問の鍵はどのように判断するかです。
入力「abbbcccd」を例にとると、indexOf(char ch)とlastIndexOf(char ch)を使用して値を比較できます。文字の最初のインデックス位置と最後のインデックス位置が同じである場合、それは文字が1回だけ表示され、文字が「a」などのsbに格納されることを意味します。文字の最初のインデックス位置と最後のインデックス位置の場合位置が異なります。最初の「b」を格納するだけでよいため、「b」のように文字が少なくとも2回表示されることを意味します。したがって、str.indexOf(c)== iの場合、文字をsbに格納します。 、それ以外の場合は保存されません。文字「c」と文字「d」の操作は上記と同じです。
3.アルゴリズム分析:
1.時間の複雑さはO(N)であり、余分なスペースの複雑さはO(1)です。
コードは以下のように表示されます
import java.util.*;
public class Solution {
/**
* 去除字符串中的重复字符
* @param str string字符串
* @return string字符串
*/
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String str=in.nextLine();
String result=removeDuplicatedChars ( str);
System.out.println(result);
}
public static String removeDuplicatedChars (String str) {
// write code here
StringBuffer sb=new StringBuffer();
for(int i=0;i<str.length();i++) {
//依次拿出每一个字符
char c=str.charAt(i);
//该字符的第一个索引位置和最后一个索引位置相同,表示只出现一次
if(str.indexOf(c)==str.lastIndexOf(c)) {
sb.append(c);
}else {
//该字符的第一个索引位置和最后一个索引位置不同
if(str.indexOf(c)==i) {
sb.append(c);
}
}
}
String result=new String(sb);
return result;
}
}