[搜狗] 找一个字符串中包含全部出现字符的最小字符串
2015-02-04 15:55
162 查看
一个字符串中含有n个字符,其中有m个不同的字符,n>>m,用最少的时间和空间找到包含所有这m个字符的最短的字串,不考虑特殊字符,只考虑字母数字即可。
例如:
abccbaddac,返回:cbad
aabcadbbbcca,返回:bcad
实现代码:
例如:
abccbaddac,返回:cbad
aabcadbbbcca,返回:bcad
实现代码:
#include <iostream> using namespace std; void Search(char input[], char output[]); int main() { char* input = "abccbaddac"; char* output = new char[strlen(input)]; Search(input,output); cout<<output<<endl; } void Search(char input[], char output[]) { bool num[10] = {0}; //数字字符 bool small[26] = {0}; //小写字符 bool big[26] = {0}; //大写字符 int sum = 0; //不同字符的个数 int temp, index; for (int i = 0; i < strlen(input); i++) { temp = input[i]; if (temp >= 97) { index = input[i] - 'a'; if (small[index] == 0) { small[index] = 1; sum++; } } else if (temp <= 57) { index = input[i] - '0'; if (num[index] == 0) { num[index] = 1; sum++; } } else { index = input[i] - 'A'; if (big[index] == 0) { big[index] = 1; sum++; } } } bool t_num[10] = {0}; //数字字符 bool t_small[26] = {0}; //小写字符 bool t_big[26] = {0}; //大写字符 int t_sum = 0; int min = strlen(input); char* out = new char[strlen(output) + 1]; memset(out,0,sizeof(out)); for (int i = 0; i < strlen(input); i++) { char* pout = out; t_sum = 0; memset(t_num,0,sizeof(t_num)); memset(t_small,0,sizeof(t_small)); memset(t_big,0,sizeof(t_big)); int j = i; while(j < strlen(input)) { *pout++ = input[j]; temp = input[j]; if (temp >= 97) { index = input[j] - 'a'; if (t_small[index] == 0) { t_small[index] = 1; t_sum++; } } else if (temp <= 57) { index = input[j] - '0'; if (t_num[index] == 0) { t_num[index] = 1; t_sum++; } } else { index = input[j] - 'A'; if (t_big[index] == 0) { t_big[index] = 1; t_sum++; } } if (t_sum == sum) { int len = j - i; if(min > len) { min = len; *pout = '\0'; strcpy(output,out); j = i + len - sum; break; } } j++; } } delete [] out; }
相关文章推荐
- [经典面试题][搜狗]在一个字符串中寻找包含全部出现字符的最小字串
- 一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出。
- day07之包含min函数的栈+查找一个字符串中第一个只出现两次的字符
- 一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出。
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 【c语言】一个字符串,包含n个字符。将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
- 一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出。
- 26.在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 【剑指Offer-时间效率平衡】在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
- C语言:有一个字符串,包含n个字符。写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串
- 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 一个字符串中查找另一个字符出现的全部索引位置(JAVA)
- 删除字符串中出现次数最小的字符及书写字符串函数时的一个注意点
- 给定一个只包含小写字母的字符串,删除重复的字母,每个字母只出现一次。在所有结果中,输出字典顺序最小的。
- 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置