通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
package test;
import java.util.Scanner;
public class StringFliter {
public static void main(String[]args){
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
char[] charArray = str.toCharArray();
int length = charArray.length;
char[] fitArray = new char[length];
System.out.println("src="+String.valueOf(charArray));
//strFliter(charArray,length,fitArray);
strFliterEft(charArray,length,fitArray);
System.out.println("dst="+String.valueOf(fitArray));
}
//低效方法
private static void strFliter(char[] charArray, int length, char[] fitArray) {
// TODO Auto-generated method stub
int flitCount = 1;
int chCount = 0;
for(int i=0;i<length;i++){//遍历原数组
char ch = charArray[i];
if(i==0)fitArray[0] = ch;
for(int j=0;j<flitCount&&flitCount<=length;j++){//遍历目标数组,判断是否已存在该字符
if(ch!=fitArray[j]&&j==flitCount-1){
fitArray[flitCount++] = ch;//不存在
chCount++;//统计字符个数
}else if(ch==fitArray[j]){//存在
break;
}
}
}
for(int i=chCount+1;i<length;i++){
fitArray[i]= '#';
}
}
//高效方法
private static void strFliterEft(char[] charArray, int length, char[] fitArray) {
int hash[] = new int[26];
int j = 0;
for(int i=0;i<length;i++){
if(0==hash[charArray[i]-'a']){
hash[charArray[i]-'a'] = 1;
fitArray[j++] = charArray[i];
}
}
for(;j<length;j++){
fitArray[j]= '#';
}
}
}
采取空间获取时间的方法,利用额外的数组记录字符是否已经出现,提高效率,只需遍历一遍即可。
输入字符序列:
sfwfwfgegggrgw
输出结果:
src=sfwfwfgegggrgw
dst=sfwger########