1.用到了很多字符串的知识,
比如 str-'a'表示在小写字母列表中,str的位置,比如 ‘a’-'a'=0表示 a是字母表第一个小写字母,‘b’-'a'=1表示b是字母表第二个小写字母;
2.给变量初始化,
一开始没有对little和big数组进行初始化,导致出现了无限循环,因为没有初始化时,会随机分配一个数字。
(小技巧,如果对某个值进行加减操作,要提前初始化;如果定义变量时接下来就是赋值,不需要初始化一个值)
3.对于这种字母关系的,因为总数确定,比如有26个字母,就可以对a的个数进行个数加减
4,对于数字型字符串 转数字型数字 ,则采用 str-'0'
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cin>>str;
int little[26];
int big[26];
for(int i=0;i<26;i++)
{
little[i] = 0;
big[i] = 0;
}
for(int i=0;i<str.length();i++)
{
if(str[i]>='a'&&str[i]<='z')
{
little[(str[i]-'a')]++;
}
if(str[i]>='A'&&str[i]<='Z')
{
big[(str[i]-'A')]++;
}
}
bool flag=false;
for(int i=0;i<str.length();i++)
{
if(little[i]&&big[i])
{
flag=true;
}
}
if(!flag)
{
printf("not found");
}
for(int i=0;i<26;i++)
{
while(little[i]&&big[i])
{
printf("%c%c",(i+'A'),(i+'a'));
big[i]--;
little[i]--;
bool flag=true;
for(int j=i+1;j<26;j++)
{
if(big[j]&&little[j]&&flag)
{
printf("%c%c",(j+'A'),(j+'a'));
big[j]--;
little[j]--;
}
else
{
flag=false;
}
}
printf("\n");
}
}
return 0;
}