去除重复字符串

2020-04-21  本文已影响0人  吕建雄

给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

示例 1:

输入:"bcabc"输出:"abc"

示例 2:

输入:"cbacdcbc"输出:"acdb"

/*

解题关键:

字典序: 字符串之间比较和数字比较不一样; 字符串比较是从头往后挨个字符比较,那个字符串大取决于两个字符串中第一个对应不相等的字符; 例如 任意一个a开头的字符串都大于任意一个b开头的字符串;例如字典中apple 大于 book;

题目的意思,你去除重复字母后,需要按最小的字典序返回.并且不能打乱其他字母的相对位置;

例如 bcabc 你应该返回abc, 而不是bca,cab;

例如 cbacdcbc 应该返回acdb,而不是cbad,bacd,adcb

例如 zab,应该返回zab,而不是abz;

思路:

1. 判断字符串可能出现的特殊情况

2. 用一个record数组记录字符串中字母出现的次数;

3. 申请一个字符串栈stack用来存储去除重复字母的结果,并利用它的特性帮助我们找到正确的次序;

4. 遍历字符串s

5. 遍历stack 判断当前字符s[i]是否存在于栈stack中

    如果当前字符是否存在于栈的定义一个falg 标记isExist, 0表示不存在, 1表示存在

6.如果isExist存在,record[s[i]]位置上的出现次数减一,并继续遍历下一个字符; 表示当前的stack已经有这个字符了没有必要处理这个重复的字母;

7.如果isExist不存在,则

    如果不存在,则需要循环一个找到一个正确的位置,然后在存储起来;

    如果不存在,跳过栈中所有比当前字符大、且后面还会出现的元素,然后将当前字符入栈

    !stack.isEmpty() 表示栈不为空

    stack.peek() > sCharArray[i]表示栈顶元素比当前元素大

    record[stack.peek()-'a'] > 1表示后面还会出现

通过一个while循环找到将栈中位置错误的数据,出栈. 找当前合适的位置,则结束while循环;

找到合理的位置后,则将当前字符s[i]入栈;

8.直到遍历完所有字符后,则为字符串栈stack

*/

代码下载地址

上一篇下一篇

猜你喜欢

热点阅读