字符串专题
2878.字串排序
在 2010 年百度公司的一次校园招聘笔试中,要求应聘者设计一个 strnumcmp 函数。对比普通的 strcmp 函数,差别在于,当字符串中包含数字时,比较数字大小。数字大小相同或不含数字时,仍然沿用原来的 strcmp 方式。所有不含数字的字符串均小于含数字的字符串。每个字符串的长度范围为 1 ~ 30,而其中包含的数字个数范围为 0 ~ 8,且数字在一个字符串中是连续的。
例如:strnumcmp 的判定结果:
“abc”<“abc#”<“abcd”<“abc1”<“abc2”<“abc10”
而一般的 strcmp 的判定结果:
“abc”<“abc#”<“abc1”<“abc10”<“abc2”<“abcd”
写一个程序,用 strnumcmp 函数对一组字符串按升序排序。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int getNum(string s)
{
int len = s.length();
int flag = 0, sum = 0;
for (int i = 0; i < len; i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
sum = 10 * sum + s[i] - '0';
flag = 1;//has a number
}
}
if (flag == 0) sum = -1;//has no number
return sum;
}
bool strnumcmp(string a, string b)
{
int num1 = getNum(a), num2 = getNum(b);
if (num1 == num2) return a < b;
else
{
if (num1 < num2) return true;
else return false;
}
}
int main()
{
string s[120];
int cnt = 0;
while (cin >> s[cnt])
{
cnt++;
//getchar();
}
sort(s, s + cnt, strnumcmp);
//cout << cnt << endl;
for (int i = 0; i < cnt-1; i++)
cout << s[i] << " ";
cout << s[cnt - 1] << endl;
}
3194.字符串消除
给定一个由大写字母A、B、C构成的字符串s,按如下进行消除过程:
1、字符串s中连续相同字母组成的子串,如果子串的长度大于1,那么这些子串会被同时消除,余下的字符拼成新的字符串。
例如:ABCCBCCCAA中CC,CCC和AA会被同时消除,余下AB和B拼成新的字符串ABB。
2、反复进行上述消除,直到新的字符串中相邻字符都不相同为止。
例如:ABCCBCCCAA经过一轮消除得到ABB,再经过一轮消除得到A。
假设在对字符串s消除开始前,允许在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符(A,B或者C),得到字符串t,然后对字符串t经过一系列消除。
请问该如何插入字符,使得字符串t中被消除掉的字符总数(包括插入的字符)最多?
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int del(string &s)
{
int x = 0;//消除字符个数
int flag = 0;
for (int i = 0; s.length() > 0 && i < s.length() - 1; i++)
{
if (s[i] == s[i + 1])
{
x++;
int y = 1;
for (int j = i; j < s.length() - 1; j++)
if (s[j] == s[j + 1]) x++, y++;
else break;
s.erase(i, y);
flag = 1;
i--;
}
}
if (flag == 1) return x + del(s);
else return x;
}
int max(int a, int b)
{
if (a > b) return a;
return b;
}
int main()
{
int t; cin >> t;
for (int m = 0; m < t; m++)
{
string x[3] = {
"A","B","C" };
string s; cin >> s;
int len = s.length();
int ans = 0;
for (int i = 0; i < len; i++)
{
for (int j = 0; j < 3; j++)
{
string temp(s); temp.insert(i, x[j]);
ans = max(ans, del(temp));
}
}
cout << "case #" << m << ":\n" << ans << endl;
}
}
3023.字符组合
输入一个由字母组成的字符串S,长度[1,16],按字典序输出由 中不同字符组成的所有字符组合(每个组合中的字符也按字典序排列)。
例如:cbaabc 中的不同字符是 a、b、c 共 3 个,则 1 个字符组成的组合是 a、b、c3 种,2 个字符组成的组合是 ab、bc、ac3 种,3 个字符组成的组合是 abc1 种。注意:ab 和 ba 由相同字符组合而成,因此可认为是同一个组合。那么这个例子共有 7 种组合,按序分别为 a、ab、abc、ac、b、bc、c。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int main()
{
int t; cin >> t;
for (int I = 0; I < t; I++)
{
vector<char> str;
vector<string>out;
string s; cin >> s;
//去重
for (int i = 0; i < s.length(); i