数据结构与算法--字符匹配 & 字符去重
1. 去除重复字母
-
题目
给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)
示例1: 输入:"bcabc" 输出:"abc" 示例2: 输入:"cbacdcbc" 输出:"acdb"
-
题目分析
题目的意思,你去除重复字母后,需要按最小的字典序返回.并且不能打乱其他字母的相对位置
字典序:
字符串之间比较和数字比较不一样,字符串比较是从头往后挨个字符比较,那个字符串大取决于两个字符串中第一个对应不相等的字符;
例如: 任意一个 a 开头的字符串都大于任意一个 b 开头的字符串; 例如字典中 apple 大于 book;
-
思路
1.判断字符串S是否为空,返回空,判断长度是否为1,直接返回S 2.创建一个字符数组record,长度为26,来记录字符串中,每个字符出现的次数 3.申请一个字符串栈stack,来记录去重后的字符,利用栈的特性,帮助我们找到正确的次序 4.遍历字符串 5.从0-top,遍历stack,判断当前字符是否存在stack中,定义一个标识isExist,记录当前字符是 否存在栈中,0:不存在,1:存在 6.如果当前字符存在在栈中,isExist = 1,record中对应字符位置上的出现次数减一,并继续遍历下一 个字符; 表示当前的stack已经有这个字符了没有必要处理这个重复的字母; 7.isExist = 0,表示当前字符不存在于栈中,需要找到正确的位置,入栈 判断条件:栈非空 top>-1 栈顶元素 > 当前字符 栈顶元素,在以后字符中还会出现 通过一个while循环找到将栈中位置错误的数据,出栈. 找当前合适的位置,则结束while循环; 8.找到正确位置,当前字符入栈, 9.拼接字符结束符\0
-
代码
char *removeDuplicateLetters(char *s) {
// ✅1.特殊情况判断
if (s == NULL || strlen(s) == 0) {
return "";
}
if (strlen(s) == 1) {
return s;
}
// ✅2.创建一个字符数组record,长度为26
char record[26] = {0};
int len = (int)strlen(s);
int i;
// 统计每个字符的频次
for (i = 0; i < len; i++) {
record[s[i] - 'a'] ++;
}
// ✅3.申请一个字符串栈stack,来记录去重后的字符
char* stack = (char*)malloc(sizeof(char) * len + 2);
memset(stack, 0, sizeof(char) * len + 2);
int top = -1;
// ✅4.遍历字符串
for (i = 0; i < len; i++) {
// ✅定义一个标识isExist,记录当