字符串 题解

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. **分析边界条件**:考虑空字符串、单个字符、全重复字符等情况。这些边缘情况往往是测试用例中容易出错的部分。 3. **选择合适的数据结构**: - 使用 `HashSet` 或 `HashMap` 来处理字符唯一性检查(如最长不重复子串问题)。 - 使用 `Stack` 来解决嵌套括号或递归展开的问题(如字符串解码问题)。 - 使用 `滑动窗口` 技术来优化时间复杂度,尤其在查找子串时非常有效。 4. **分步模拟逻辑**:将整个问题拆解为多个小步骤,先手动模拟几个例子,观察其中规律,再将其转化为代码逻辑。 5. **编写伪代码**:在正式编码前写出大致流程,确保逻辑清晰无误。 6. **编写与调试代码**:使用合适的语言实现算法,并进行多次测试以验证其正确性和性能。 ### 编程技巧 - **字符串遍历与索引操作**:注意不同语言对字符串的索引访问方式是否支持。 - **字符串拼接效率问题**:避免频繁创建新字符串对象,推荐使用 `StringBuilder` 类(Java)或 `list.append()` 后再合并(Python)。 - **递归与栈的应用**:当遇到多层嵌套结构时,可以使用递归或者显式栈来模拟展开过程。 - **正则表达式辅助**:在某些复杂的字符串匹配任务中,可以借助正则表达式简化判断逻辑。 ### 示例:字符串解码问题(带数字重复) #### 题意 给定一个编码字符串,如 `"3[a2[c]]"`,返回解码后的字符串 `"accaccacc"`。 #### 实现思路 维护两个栈:一个用于保存当前的倍数 `num_stack`,另一个保存当前的字符串 `str_stack`。逐字符读取输入字符串: - 当遇到数字时,构建完整的多位数。 - 当遇到 `'['` 时,将当前字符串和数字压入栈中,并重置当前字符串和数字。 - 当遇到字母时,追加到当前字符串。 - 当遇到 `']'` 时,弹出栈顶数字和上一层字符串,拼接后更新当前字符串。 ```java public class DecodeString { public String decodeString(String s) { Stack<Integer> numStack = new Stack<>(); Stack<StringBuilder> strStack = new Stack<>(); StringBuilder currentStr = new StringBuilder(); int num = 0; for (char ch : s.toCharArray()) { if (Character.isDigit(ch)) { num = num * 10 + (ch - '0'); } else if (ch == '['') { strStack.push(currentStr); numStack.push(num); currentStr = new StringBuilder(); num = 0; } else if (ch == ']') { int repeatTimes = numStack.pop(); StringBuilder temp = currentStr; currentStr = strStack.pop(); for (int i = 0; i < repeatTimes; i++) { currentStr.append(temp); } } else { currentStr.append(ch); } } return currentStr.toString(); } } ``` ### 复杂度分析 - **时间复杂度**:O(n),每个字符最多被处理两次(一次入栈/构造,一次出栈/解码)。 - **空间复杂度**:O(n),最坏情况下所有字符都被压入栈中。 ### 总结 掌握字符串处理的关键在于熟悉常见数据结构的运用及如何将抽象逻辑转化为实际代码。通过不断练习类似题目,可以显著提升对栈、递归、滑动窗口等技术的理解与应用能力[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值