字符串tips

10 篇文章 1 订阅

①将字符串全部转换为大小写问题

可采用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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值