11111111111111

11111111111111111111111111111111111111111111
111111111111111111111111111111111111111

我们要实现一个功能:**删除字符串中的重复字符,只保留每个字符第一次出现的位置,其余重复的删除**,最终输出无重复字符的字符串。 --- ### ✅ 题目要求 - 输入:一个长度 ≤ 100 的字符串(可能包含字母、数字、符号等) - 输出:去除重复字符后的新字符串,**保持原顺序** - 示例: - `abacaeedabcdcd` → `abced` - `111122233344455577yuyuyu` → `123457yu` - `11111111111111` → `1` > 即:去重,但保留首次出现的顺序 —— 类似“有序去重”。 --- ### ✅ 解决方案(C语言实现) 使用一个布尔数组 `visited[256]` 来标记某个 ASCII 字符是否已经出现过。遍历原字符串,如果没出现过就保留在结果中,并标记为已访问。 ```c #include <stdio.h> #include <string.h> int main() { char input[101]; // 最多100字符 + '\0' int visited[256] = {0}; // 标记字符是否已出现,初始化为0 char output[101]; // 存储结果,最多100个不重复字符 int out_len = 0; // 输入字符串 fgets(input, sizeof(input), stdin); // 去除换行符(如果有) int len = strlen(input); if (len > 0 && input[len - 1] == '\n') { input[len - 1] = '\0'; len--; } // 遍历输入字符串 for (int i = 0; i < len; i++) { unsigned char c = input[i]; // 使用 unsigned char 防止负数索引 if (!visited[c]) { visited[c] = 1; output[out_len++] = c; } } output[out_len] = '\0'; // 结束字符串 // 输出结果 printf("%s\n", output); return 0; } ``` --- ### 🔍 代码解释: - `visited[256]`:下标对应 ASCII 值(0~255),记录该字符是否已加入输出 - `if (!visited[c])`:若未出现,则将其加入输出,并标记为“已见” - 只需一次遍历,时间复杂度 O(n),空间复杂度 O(1)(固定数组大小) - 保证了字符按**第一次出现顺序**排列 --- ### 🧪 测试验证: #### 测试用例 1: - 输入:`abacaeedabcdcd` - 处理过程: - a → 新字符 → 加入 → `a` - b → 新 → `ab` - a → 已存在 → 跳过 - c → 新 → `abc` - a → 跳过 - e → 新 → `abce` - e → 跳过 - d → 新 → `abced` - 后面的 a,b,c,d 全部跳过 - 输出:`abced` ✅ #### 测试用例 2: - `111122233344455577yuyuyu` - 依次保留:`1`, `2`, `3`, `4`, `5`, `7`, `y`, `u` → `123457yu` ✅ #### 测试用例 3: - `111111...` → 只留一个 `1` → `1` ✅ 全部通过! --- ### ✅ 补充:Python 简洁版参考 ```python s = input().strip() seen = set() result = [] for ch in s: if ch not in seen: seen.add(ch) result.append(ch) print(''.join(result)) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ttlasdd

感谢感谢您!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值