如何从字符串中删除重复的字符
how to delete duplicate character from a string
题目要求我写一个删除原字符串中重复字符的方法和return新的string.For例子,原字符串是abracadabra,结果应该是abrcd。
我正在考虑使用 StringBuilder 来删除字符,但是当我尝试 运行 代码时出了点问题。谁能帮我解决一下。
public static String eliminateDuplicates(String str){
String result = "";
StringBuilder strings = new StringBuilder(str);
for(int i = 0; i<str.length(); i++){
for(int j = 1; j<str.length();j++){
if(str.charAt(i)==str.charAt(j)){
strings.deleteCharAt(j);
}
}
}
result = strings.toString();
return result;
}
有问题的代码正在遍历输入字符串,但使用索引从字符串生成器对象中删除字符。
每次字符串生成器删除字符时,它的大小都会减小。因此,您的代码将因 IndexOutofBoundsException 而失败。如果是这种情况,请在问题中添加异常的整个堆栈跟踪以确认。
删除重复项的更好方法是通过遍历输入字符串然后仅将唯一字符复制到新字符串来创建另一个字符串。然后可以将新字符串作为结果返回。
与具有 O(n*n)
时间复杂度的当前代码相比,这也将具有更好的 O(n*m)
时间复杂度
试试这个。
public static String eliminateDuplicates(String str){
int[] uniq = str.codePoints().distinct().toArray();
return new String(uniq, 0, uniq.length);
}
试试这段代码,也许你可以优化:
public static String eliminateDuplicates(String source) {
StringBuilder result = new StringBuilder();
for (int i = 0, sLength = source.length(); i < sLength; i++) {
char readyToAdd = source.charAt(i);
boolean add = true;
for (int j = 0; j < result.length(); j++) {
if (readyToAdd == result.charAt(j)) {
add = false;
break;
}
}
if (add) result.append(readyToAdd);
}
return result.toString();
}
借鉴@P.J的想法
public static String eliminateDuplicates(String str) {
HashSet<Character> hashSet = new HashSet();
//A hashSet is a collection that only adds unique elements.
char[] toCharArray = str.toCharArray();
for (char c : toCharArray) {
hashSet.add(c);
}
StringBuilder answer = new StringBuilder();
for (Character character : hashSet) {
answer.append(character);
}
return answer.toString();
}
试试这个
public static String eliminateDuplicates(String str){
StringBuilder result = new StringBuilder();
BitSet bs=new BitSet(256);
char[] chars=str.toCharArray();
char getChar=0;
for(int i=0;i<chars.length;i++){
getChar=chars[i];
if(!bs.get(getChar)){
result.append(getChar);
bs.set(getChar);
}
}
return result.toString();
}
题目要求我写一个删除原字符串中重复字符的方法和return新的string.For例子,原字符串是abracadabra,结果应该是abrcd。
我正在考虑使用 StringBuilder 来删除字符,但是当我尝试 运行 代码时出了点问题。谁能帮我解决一下。
public static String eliminateDuplicates(String str){
String result = "";
StringBuilder strings = new StringBuilder(str);
for(int i = 0; i<str.length(); i++){
for(int j = 1; j<str.length();j++){
if(str.charAt(i)==str.charAt(j)){
strings.deleteCharAt(j);
}
}
}
result = strings.toString();
return result;
}
有问题的代码正在遍历输入字符串,但使用索引从字符串生成器对象中删除字符。
每次字符串生成器删除字符时,它的大小都会减小。因此,您的代码将因 IndexOutofBoundsException 而失败。如果是这种情况,请在问题中添加异常的整个堆栈跟踪以确认。
删除重复项的更好方法是通过遍历输入字符串然后仅将唯一字符复制到新字符串来创建另一个字符串。然后可以将新字符串作为结果返回。
与具有 O(n*n)
O(n*m)
时间复杂度
试试这个。
public static String eliminateDuplicates(String str){
int[] uniq = str.codePoints().distinct().toArray();
return new String(uniq, 0, uniq.length);
}
试试这段代码,也许你可以优化:
public static String eliminateDuplicates(String source) {
StringBuilder result = new StringBuilder();
for (int i = 0, sLength = source.length(); i < sLength; i++) {
char readyToAdd = source.charAt(i);
boolean add = true;
for (int j = 0; j < result.length(); j++) {
if (readyToAdd == result.charAt(j)) {
add = false;
break;
}
}
if (add) result.append(readyToAdd);
}
return result.toString();
}
借鉴@P.J的想法
public static String eliminateDuplicates(String str) {
HashSet<Character> hashSet = new HashSet();
//A hashSet is a collection that only adds unique elements.
char[] toCharArray = str.toCharArray();
for (char c : toCharArray) {
hashSet.add(c);
}
StringBuilder answer = new StringBuilder();
for (Character character : hashSet) {
answer.append(character);
}
return answer.toString();
}
试试这个
public static String eliminateDuplicates(String str){
StringBuilder result = new StringBuilder();
BitSet bs=new BitSet(256);
char[] chars=str.toCharArray();
char getChar=0;
for(int i=0;i<chars.length;i++){
getChar=chars[i];
if(!bs.get(getChar)){
result.append(getChar);
bs.set(getChar);
}
}
return result.toString();
}