1、算法思路
(1)先将字符串转换为字符数组,然后利用set不能存储重复对象的特性进行去重;
(2)遍历字符串,若当前位置i处的字符在字符串中首次出现的位置firstIndex等于其最后出现的位置lastIndex,则说明当前字符只有一个;若当前位置i处的字符不止一个,选取首次出现的字符作为新字符串中的字符,则之后的重复字符就不满足firstIndex == i。
2、具体代码
package com.peter.algorithm.other;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
public class CharacterDeduplication {
@Test
public void test() {
String origin = "abc123456789defggfed9876cb54321a";
System.out.println(deduplicationBySet(origin));
System.out.println(deduplicationByIndex(origin));
}
public static String deduplicationBySet(String origin) {
if (origin == null || origin.isEmpty()) {
return null;
}
StringBuilder stringBuilder = new StringBuilder();
Set<Character> set = new HashSet<>();
char[] chars = origin.toCharArray();
for (char temp : chars) {
if (!set.contains(temp)) {
stringBuilder.append(temp);
set.add(temp);
}
}
return stringBuilder.toString();
}
public static String deduplicationByIndex(String origin) {
if (origin == null || origin.isEmpty()) {
return null;
}
StringBuilder stringBuilder = new StringBuilder();
int len = origin.length();
for (int i = 0; i < len; i++) {
char tempChar = origin.charAt(i);
int firstIndex = origin.indexOf(tempChar);
int lastIndex = origin.lastIndexOf(tempChar);
//若当前字符在字符串中首次出现的位置等于其最后出现的位置,则说明当前字符只有一个
//若当前字符不止一个,选取首次出现的字符作为新字符串中的字符,则之后的重复字符就不满足firstIndex == i
if ( firstIndex == lastIndex || firstIndex == i) {
stringBuilder.append(tempChar);
}
}
return stringBuilder.toString();
}
}
3、测试结果
origin string | target string |
---|---|
abc123456789defggfed9876cb54321a | abc123456789defg |
当你想要放弃的时候,想想你为什么想要开始 | 当你想要放弃的时候,为什么开始 |