字符串的题目整理

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设 maxn 是单词中出现次数最多的字母的出现次数,minn 是单词中出现次数最少的字母的出现次数,如果 maxn−minn 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。

输入格式

一个单词,其中只可能出现小写字母,并且长度小于 100。

输出格式

共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word,否则输出 No Answer

第二行是一个整数,如果输入单词是 Lucky Word,输出 maxn−minn 的值,否则输出 0。

这到题上来可以说是没太有思路,想用另一个数组来存储重复出现的字母,奈何写不出来,后来想到可以用循环直接赋值,然后遍历输入的字符串,再创建一个数组,用这个数组记录26个字母的编号,在遍历这个字符串的过程中,每遇到一个相同的字母,就令数组中的对应元素加一,然后再用for循环来找出最大值和最小值,最后在判断是否为质数就可以了

1.找到重复出现的字符是重点

2.找到最大值和最小值

3.判断是否为质数(可以用布尔变量创建一个函数)

代码解答
#include<iostream>
using namespace std;
string word;
string copyword;
char zimu[26];
bool isPrime(int n) {
	if (n <= 1) {
		return false;
	}
	for (int i = 2; i * i <= n; i++) {
		if (n % i == 0) {
			return false;
		}
	}
	return true;
}
int main()
{
	cin >> word;
	int maxn = 0;
	int main = word.length();
	for (int i = 0; i < word.length(); i++)
	{
		char c = word[i];
		zimu[c - 'a']++;
	}
	for (int i = 0; i < 26; i++)
	{
		if (zimu[i] > maxn)
		{
			maxn = zimu[i];
		}
		if(zimu[i]<main&&zimu[i]>0)
		{
			main = zimu[i];
		}
	}
	int diff = maxn - main;
	if (isPrime(diff)) {
		cout << "Lucky Word" << endl;
		cout << diff << endl;
	}
	else {
		cout << "No Answer" << endl;
		cout << 0 << endl;
	}
}
for (int i = 0; i < word.length(); i++)
	{
		char c = word[i];
		zimu[c - 'a']++;
	}

就这一小段代码可是困扰了我好久,可以整理一下

首先利用for循环遍历这个字符串,再定义一个单个的字符来接收字符串中的值

还有一个重要的点因为这道题题目中说了,只有小写字母才可以用这种方式,因为大写字母的ASCII码是小写字母加上32

因为a的ASCII码是97,所以在每次c接受到字符串的值的时候

比如c接受了一个字母b,b的ASCII码为98,则循环中的’c-a'就是1,则数组zimu[1]就是字母‘b'出现的次数

由此可以在zimu这个数组中记录字母出现的次数

再用一个简单的找最大值最小值的方法找出出现的字母的最大值和最小值

最后创建一个函数来判断是否为质数

质数:大于1的自然数,且只有1和它自己本身的两个因数

### 力扣(LeetCode)字符串处理题目 Java 实现方法 #### 字符串乘法问题 对于字符串相乘的问题,可以采用 `BigInteger` 类来简化操作。通过将输入的两个字符串转换为 `BigInteger` 对象并执行乘法运算,最后返回结果作为字符串形式[^2]。 ```java import java.math.*; class Solution { public String multiply(String num1, String num2) { BigInteger b1 = new BigInteger(num1); BigInteger b2 = new BigInteger(num2); return b1.multiply(b2).toString(); } } ``` 此解决方案利用了 Java 的内置类库功能,能够有效处理大数计算场景下的字符串乘法需求。 --- #### 基于哈希表和滑动窗口的字符串匹配问题 某些 LeetCode 题目涉及子字符串查找或者符频率统计等问题,通常可以通过 **哈希表** 和 **滑动窗口** 技术解决。例如,在给定字符串中找到满足特定条件的最小子串时,可定义双指针分别表示当前窗口的起始位置和结束位置,并动态调整窗口大小以优化性能[^3]。 下面是一个基于滑动窗口算法的经典例子——寻找包含目标字符串所有符的最小覆盖子串: ```java public class Solution { public String minWindow(String s, String t) { if (s.isEmpty() || t.isEmpty()) return ""; int[] map = new int[128]; for(char c : t.toCharArray()){ map[c]++; } int left=0, right=0; int counter=t.length(); // 记录还需要多少个符才能完全匹配t int start=0, end=s.length()+1; // 结果区间[start,end) while(right<s.length()){ char rChar = s.charAt(right); if(map[rChar]>0){ counter--; // 如果rChar存在于t中,则减少counter计数器 } map[rChar]--; while(counter==0){ // 当前[left,right]已经包含了所有的t中的符 if((right-left)<(end-start)){ start=left; end=right+1; } char lChar = s.charAt(left); map[lChar]++; if(lChar>0 && map[lChar]>0){ counter++; // 移除lChar后不再满足条件,增加counter } left++; } right++; } return (end == s.length()+1)? "" : s.substring(start, end); } } ``` 上述代码实现了如何使用滑动窗口技术高效求解最小覆盖子串问题。 --- #### 更多资源推荐 除了以上提到的具体实现外,还可以参考专门整理的 LeetCode 解决方案集合[^1]以及每日更新的题解博客[^4],这些资料提供了丰富的案例分析和技术讨论,有助于深入理解各种类型的字符串处理技巧及其对应的 Java 编程实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值