剑指Offer_面试题35_第一个只出现一次的字符

来源:互联网 发布:win10 加密软件哪款好 编辑:程序博客网 时间:2024/06/04 23:33

题目描述

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

分析:用数组模拟哈希表,没毛病

class Solution {public:    int FirstNotRepeatingChar(string str) {        int record[256] = {0};        int res = -1;        for(char c : str)            ++record[c];        for(int i = 0; i < str.size(); ++i)        {            if(record[str[i]] == 1)            {                res = i;                break;            }         }        return res;    }};

扩展题一:定义一个函数,输入两个字符串,从第一个字符串删除在第二个字符串中出现过的所有字符。例如第一个字符串“hello”,第二个字符串“ell”,删除之后第一个字符串变为“ho"
解决方法是快慢双指针,经典的方法,快指针慢指针刚开始都指向字符串开始,当快指针指向的字符出现在第二个字符中时,快指针向下遍历直到遍历到不需要删除的字符,然后进行赋值,把快指针的字符赋值给慢指针,然后两个指针都向下移动,终止条件是快指针指向字符串结尾。
#include <stdio.h>#include <stdlib.h>#include <string.h>void Delete_ch(char *src, char* del_chs){if (!src || !del_chs) return;int record[256] = { 0 };char *fast = src;char *slow = src;//记录字符int len_del = strlen(del_chs);for (int i = 0; i < len_del; ++i)record[del_chs[i]] = 1;while (*fast != '\0'){//这里是whilewhile (*fast != '\0' && record[*fast] == 1){++fast;}if (*fast != '\0'){*slow = *fast;++slow, ++fast;}}*slow = '\0';}int main(){char str[] = "hello worlll";char str_del[] = "elr";Delete_ch(str, str_del);printf("%s/n", str);getchar();return 0;}