每日算法(8)——去掉字符串中重复字符

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 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
当你想要放弃的时候,想想你为什么想要开始 当你想要放弃的时候,为什么开始

你可能感兴趣的:(每日算法,字符去重,重复字符)