关于字符串问题遇到的一些小知识点
①将字符串全部转换为大小写问题
可采用tolower()、toupper()函数,在<ctype.h>头文件中
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <iostream>
using namespace std;
int main()
{
string s;
getline(cin, s);
for(int i = 0; s[i]; i++)
s[i] = tolower(s[i]);
cout<<"转换为小写:"<<s<<endl;
for(int i = 0; s[i]; i++)
s[i] = toupper(s[i]);
cout<<"转换为大写:"<<s<<endl;
return 0;
}
②求按字典序排列的子序列
求字典序最大的子序列解题思路:
首先,按字典序排列的最大子序列一定包含最后一个字母
从后往前找,后面的总是小于等于前面的元素才能保证子序列按字典序排列
搞个代码练练手
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
getline(cin, s);
int size = s.length();
string ss;
ss[0] = s[size - 1];
int k = 0;
for(int i = size - 2; i >= 0; i--)
if(ss[k] <= s[i])
ss[++k] = s[i];
cout<<s<<"字典序最大的子序列为:";
for(int i = k; i >= 0; i--)
cout<<ss[i];
return 0;
}
全排列字典序序列
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
int main()
{
string list;
getline(cin, list);
int n = list.length();
int num = 1, a = 0, b = 0;
for(int i = n; i > 0; i--)
num *= i;//全排列数目
while(num--)
{
for(int i = 0; i < n; i++)
cout<<list[i];
printf("\n");
for(int i = n - 1; i > 0; i--)
{
if(list[i-1] < list[i])
{
a = i - 1;
break;
}
}
for(int j = n-1; j > a; j--)
if(list[j] > list[a])
{
b = j;
break;
}
char temp;
temp = list[a];
list[a] = list[b];
list[b] = temp;
char tem;
for(int i = 1; i < n-a; i++)
{
for (int j = a+1; j < n-1; j++)
{
if(list[j] > list[j+1])
{
tem = list[j];
list[j] = list[j+1];
list[j+1] = tem;
}
}
}
}
return 0;
}
字符串所有字典序值子序列(去重,从小到大)
//采用递归,所有字母只有两种状态:选或不选
#include <bits/stdc++.h>
using namespace std;
typedef list<string> List;
List lis;
List::iterator it;
string s;
int len;
void GetS(int i, string ss)
{
if(i == len)
{
if(ss.length() != 0)//空串不输出
lis.push_back(ss);
return ;
}
GetS(i+1, ss + s[i]);
GetS(i+1, ss);
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
getline(cin, s);
len = s.length();
GetS(0, "");
lis.sort();
lis.unique();
for(it = lis.begin(); it != lis.end(); it++)
cout << (*it)<<endl;
return 0;
}
求固定长度的最小字典序子序列
#include <stdio.h>
//交换list[a],list[b]
void Swap(int list[], int a, int b)
{
int temp = 0;
temp = list[a];
list[a] = list[b];
list[b] = temp;
return;
}
//将list区间[a,n]之间的数据由小到大排序
void Sort(int list[], int a, int n)
{
int temp = 0;
for (int i = 1; i < n-a; ++i)
for (int j = a+1; j < n-1; ++j)
if (list[j] > list[j+1])
{
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
return;
}
//全排列
void Prim(int list[], int n)
{
int num = 1, a = 0, b = 0;
for (int i = n; i > 0; --i) //计算有多少种情况,就循环多少次
num *= i;
while (num--)
{
for (int i = 0; i < n; ++i) //打印情况
printf("%d ",list[i]);
printf("\n");
for (int i = n-1; i > 0; --i) //从右往左,找出第一个左边小于右边的数,设为list[a]
if (list[i-1] < list[i])
{
a = i-1;
break;
}
for (int j = n-1; j > a; --j) //从右往左,找出第一个大于list[a]的数,设为list[b]
if (list[j] > list[a])
{
b = j;
break;
}
Swap(list, a, b); //交换list[a],list[b]
Sort(list, a, n); //将list[a]后面的数据,由小往大排列
}
return;
}
//主函数
int main()
{
int list[] = {1,2,3};
Prim(list,3);
return 0;
}
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
//交换list[a],list[b]
void Swap(string list, int a, int b)
{
char temp;
temp = list[a];
list[a] = list[b];
list[b] = temp;
return;
}
//将list区间[a,n]之间的数据由小到大排序
void Sort(string list, int a, int n)
{
char temp;
for(int i = 1; i < n-a; i++)
for (int j = a+1; j < n-1; j++)
if(list[j] > list[j+1])
{
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
return;
}
//全排列
void Prim(string list, int n)
{
int num = 1, a = 0, b = 0;
for(int i = n; i > 0; i--) //计算有多少种情况,就循环多少次
num *= i;
while(num--)
{
for(int i = 0; i < n; i++) //打印情况
cout<<list[i]<<" ";
printf("\n");
for(int i = n-1; i > 0; i--) //从右往左,找出第一个左边小于右边的数,设为list[a]
if(list[i-1] < list[i])
{
a = i-1;
break;
}
for(int j = n-1; j > a; j--) //从右往左,找出第一个大于list[a]的数,设为list[b]
if(list[j] > list[a])
{
b = j;
break;
}
Swap(list, a, b); //交换list[a],list[b]
Sort(list, a, n); //将list[a]后面的数据,由小往大排列
}
return;
}
int main()
{
string list = {"abcd"};
Prim(list,4);
return 0;
}
类型转换问题
/*str.find("字符串")返回值是字符在母串s中的下标位置;
str.find("字符串",9) 从s的下标9开始,查找字符串,返回字符串在s中的下标;
pos=s.find(str,pos) 查找s中str出现的所有位置。
pos=s.find_first_of(str) 返回str出现在母串s中的首次出现的位置
pos=s.find_last_of(str) 返回str出现在母串s中的最后一次出现的位置
*/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <sstream>
using namespace std;
void ii(int num, string &str)
{
stringstream ss(str);
ss<<num;
ss>>str;
}
int main()
{
int ans = 0;
string s = " ";
for(int i = 10000; i <= 99999; i++)
{
ii(i, s);
//如果字符串不存在包含关系,那么返回值就一定是npos
if(s.find('4') == string::npos)
ans++;
}
cout<<ans;
return 0;