字符串 题解

A - 雷同检测

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1,s2;
	getline(cin, s1);
	getline(cin, s2);
	int i;
	int la = s1.size();
	int lb = s1.size();
	for(i = 0; i < min(la, lb); i++)
	{
		if(s1[i] == s2[i])
			cout << i + 1 << ' ';
	}
	return 0;
}

B - 首字母大写

#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
	string s1;
	getline(cin, s1);
	int word = 0;
	int i, flag = 0, len = s1.size();
	for(int i=0;i<len;i++) {
		if(s1[i]==' ') word=0;
		else if(word==0){
			word=1;
			flag=islower(s1[i]);
			if(flag) {
				s1[i] = toupper(s1[i]);
			}
		}
	}
	cout << s1;
	return 0;
}

C - 大小写转换

#include <stdio.h>
#include <ctype.h>
#include <string.h>
char str[100];
int main()
{
	while(scanf("%s",str)==1)
	{
		int len = strlen(str);
		int i;
		for(i = 0; i < len; i++)
		{
			if(islower(str[i]))
				str[i] = toupper(str[i]);
		}
		printf("%s\n",str);
		memset(str, '\0', sizeof str);
	}
	return 0;
}

D - 数字反转

#include <iostream>
using namespace std;
int main()
{
	string s1;
	getline(cin, s1);
	int len = s1.size();
	if(s1[0] == '0')
		cout << 0;
	int i;
	i = len - 1;
	while(s1[i] == '0') i--;
	if(s1[0] == '-')
	{
		cout << '-';
		for(i; i > 0; i--)
		{
			cout << s1[i];
		}
	}
	else
	{
		for(i; i >= 0; i--)
		{
			cout << s1[i];
		}
	}
	return 0;
}

E - 删除单词后缀

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1;
	getline(cin, s1);
	int i, len = s1.size();
	if(s1[len-2] == 'e'&&s1[len-1] == 'r'&&len != 2||s1[len-2] == 'l'&&s1[len-1] == 'y'&&len != 2)
	{
		len -= 2;
	}
	else if(s1[len - 3] == 'i'&&s1[len - 2] == 'n'&&s1[len - 1] == 'g'&& len != 3)
	{
		len -= 3;
	}
	for(i = 0; i < len; i++)
	{
		cout << s1[i];
	}
	return 0;
}

F - 判断字符串是否为回文

#include <iostream>
using namespace std;
int main()
{
	string s1;
	getline(cin, s1);
	int len = s1.size();
	int i = len / 2, flag = 0;
	for(int j = 0; j < i; j++,len--)
	{
		if(s1[j] != s1[len - 1])
			flag = 1;
	}
	if(flag == 0)
		cout << "yes" << endl;
	else
		cout << "no" << endl;
	return 0;
}

G - 基础数据结构——栈(1)

#include <iostream>
#include <stdio.h>
using namespace std;
char s1[200];
char s2[200];
int main()
{
	while(gets(s1))
	{
		int i;
		int inx = 0,flag = 0;
		for(i = 0; s1[i] != '\0'; i++)
		{
			if(s1[i] == '(' || s1[i] == '[' || s1[i] == '{')
			{
				s2[inx++] = s1[i];
			}
			else if(s1[i] == ')')
			{ 
				inx--;
				if(inx < 0 || s2[inx] != '(')
				{
					flag = 1;
					break;
				}
			}
			else if(s1[i] == ']')
			{ 
				inx--;
				if(inx < 0 || s2[inx] != '[')
				{
					flag = 1;
					break;
				}
			}
			else if(s1[i] == '}')
			{ 
				inx--;
				if(inx < 0 || s2[inx] != '{')
				{
					flag = 1;
					break;
				}
			}
		}
		if(flag == 1 || inx != 0)
		{
			cout << "no" << endl;
		}
		else
		{
			cout << "yes" << endl;
		}
	}
	return 0;
}

H - 字典序

#include <stdio.h>
#include <string.h>
char s1[10010];
char s2[10010];
int main()
{
	scanf("%s",s1);
	scanf("%s",s2);
	if(strcmp(s1,s2) < 0)
		puts("YES");
	else
		puts("NO");
	return 0;
}

I - 验证子串

#include <stdio.h>
#include <string.h>
char s1[300];
char s2[300];
int main()
{
	scanf("%s",s1);
	scanf("%s",s2);
	if(strstr(s1, s2))
	{
		printf("%s is substring of %s",s2,s1);
	}
	else if(strstr(s2,s1))
	{
		printf("%s is substring of %s",s1,s2);
	}
	else
	{
		printf("No substring");
	}
	return 0;
}

J - 子串查找

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define maxn 1000010
using namespace std;
char text[maxn], pattern[maxn];
int Next[maxn];
int main()
{
	scanf("%s%s", text, pattern);
	int la = strlen(text);
	int lb = strlen(pattern);
	memset(Next, 0, sizeof Next);
	for(int i = 1; i < lb; i++)
	{
		int j = i;
		while(j > 0)
		{
			j = Next[j];
			if(pattern[j] == pattern[i])
			{
				Next[i + 1] = j + 1;
				break;
			}
		}
	}
	int cnt = 0;
	for(int i = 0, j = 0; i < la; ++i)
	{
		if(j < lb && pattern[j] == text[i])
		{
			j++;
		}
		else
		{
			while(j > 0)
			{
				j = Next[j];
				if(text[i] == pattern[j])
				{
					j++;
					break;
				}
			}
		}
		if(j == lb) cnt++;
	}
	cout << cnt << endl;
	return 0;
}

K - 剪花布条

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<string.h>
using namespace std;
#define maxn 1001
string a;
string b;

int Next[maxn];
void makenext(int bl)
{
    Next[0] = 0;
    for (int i = 1, j = 0; i < bl; i++)
    {
        while (j>0 && b[j] != b[i])
            j = Next[j - 1];
        if (b[i] == b[j])
        {
            j++;
        }
        Next[i] = j;
    }
}
int kmp(int al, int bl)
{
    makenext(bl);
    int cnt = 0;
    for (int i = 0, j = 0; i < al; i++)
    {
        while (j>0 && b[j] != a[i])
            j = Next[j - 1];
        if (b[j] == a[i])
            j++;
        if (j == bl){
            cnt++;
            j=0;
        }
    }
    return cnt;
}
int main()
{
    while ((cin >> a)&&(a != "#"))
    {
        cin >> b;
        memset(Next, 0, sizeof(Next));
        int al = a.length();
        int bl = b.length();
        int res = kmp(al, bl);
        cout << res << endl;
    }
}

L - 最长回文子串

#include <bits/stdc++.h>
using namespace std;
char s[1010];
int dp[1010][1010];
int main()
{
	gets(s);
	int len = strlen(s);
	int ans = 1;
	for(int i = 0; i < len; i++)
	{
		dp[i][i] = 1;
		if(i < len - 1)
		{
			if(s[i] == s[i + 1])
			{
				dp[i][i + 1] = 1;
				ans = 2;
			}
		}
	}
	for(int j = 3; j <= len; j++)
	{
		for(int i = 0; i + j - 1 < len; i++)
		{
			int l = i + j - 1;
			if(s[i] == s[l] && dp[i + 1][l - 1] == 1)
			{
				dp[i][l] = 1;
				ans = j;
			}
		}
	}
	cout << ans << endl;
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值