C++之输出字符串中重复字符

题目:输出字符串中连续出现两次及以上的字符

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
    char Input[1024],Output[1024];
    int i,j,k;
    scanf("%s",Input);
    char *p=Output;
    *p = 0;
    for(i=0;Input[i]!='\0';i++)
        for(j=i+1;Input[j]!='\0';j++)
            if(Input[i]==Input[j]){
                for(k=0;Output[k]!='\0';k++)
                    if(Input[i]==Output[k])
                        break;
                if(k==strlen(Output)){
                    *p++=Input[i];
                    *p = 0;
                    break;
                }
            }
    puts(Output);
    return 0;
}

扩展题目:统计字符串中各个字符出现的次数

int main(){
    char str[1024];
    scanf("%s",str);
    int arr[1024]={0},i;
    for(i=0;str[i]!='\0';i++)
        arr[str[i]]++;    //使用ASCII作为下标
    for (char i = 0; i < 127; i++)
        if (arr[i] != 0)
            printf("%c  %d\n",i,arr[i]);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
思路: 1. 定义一个布尔类型的数组 used,用于记录每个字符是否已经出现过。 2. 定义一个栈 stack,用于存储最终的结果。 3. 遍历字符串,对于每个字符: - 如果该字符已经出现过(used[c] 为真),则直接跳过; - 如果该字符比栈顶元素小(即该字符在栈顶元素之前出现过),则弹出栈顶元素,直到栈顶元素不大于该字符为止; - 将该字符压入栈,并将 used[c] 设置为真。 4. 将栈的元素依次弹出并拼接成字符串,即为结果。 代码实现: ```c #include <stdio.h> #include <string.h> #include <stdbool.h> char* removeDuplicateLetters(char* s) { int len = strlen(s); bool used[26] = {false}; // 记录每个字符是否已经出现过 int count[26] = {0}; // 记录每个字符出现的次数 for (int i = 0; i < len; i++) { count[s[i] - 'a']++; } char stack[len + 1]; // 定义栈 int top = -1; // 栈顶指针 for (int i = 0; i < len; i++) { int c = s[i] - 'a'; if (used[c]) { count[c]--; continue; } while (top >= 0 && stack[top] > s[i] && count[stack[top] - 'a'] > 0) { used[stack[top] - 'a'] = false; top--; } stack[++top] = s[i]; used[c] = true; count[c]--; } stack[top + 1] = '\0'; // 栈顶指针加 1,用 '\0' 结束字符串 return stack; } int main() { char s[] = "bcabc"; char* result = removeDuplicateLetters(s); printf("%s\n", result); // 输出 "abc" return 0; } ``` 时间复杂度:O(n),其 n 是字符串的长度。遍历字符串一遍的时间复杂度是 O(n),弹出栈顶元素的时间复杂度也是 O(n),因此总时间复杂度是 O(n)。 空间复杂度:O(1)。由于只涉及到字符集大小的常数级别的空间开销,因此空间复杂度是 O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值