B2126 连续出现的字符

记录31

#include <bits/stdc++.h>
using namespace std;
int main(){
	int k,cnt=1;
	string s;
	cin>>k;
	cin>>s;
	for(int i=1;i<s.size();i++){
		if(s[i]==s[i-1]) cnt++;
		else cnt=1;
		if(cnt==k){
			cout<<s[i];
			return 0;
		}
	}
	cout<<"No";
    return 0;
}

题目传送门https://www.luogu.com.cn/problem/B2126


突破点

字符串中第一个连续出现次数不低于 k 次的字符。如果没有符合条件的字符,输出 No

👉统计字符串中某个字符的个数


思路

  1. 遍历整个字符串
  2. 遇到连续的字符进行统计
  3. 不连续的字符重新计数
  4. 判断输出情况

代码简析

#include <bits/stdc++.h>
using namespace std;
int main(){
	int k,cnt=1;
	string s;
	cin>>k;
	cin>>s;
	for(int i=1;i<s.size();i++){
		...
        ...
	}
	...
    return 0;
}

k代表需要找到的次数,cnt字符串计数统计

for循环遍历整个字符串,扫码每一个字符,然后进行计数

#include <bits/stdc++.h>
using namespace std;
int main(){
	int k,cnt=1;
	string s;
	cin>>k;
	cin>>s;
	for(int i=1;i<s.size();i++){
		if(s[i]==s[i-1]) cnt++;
		else cnt=1;
		if(cnt==k){
			cout<<s[i];
			return 0;
		}
	}
	cout<<"No";
    return 0;
}

if(s[i]==s[i-1]) cnt++;  如果前一个字符等于现在的字符,cnt开始计数统计

注意:因为i是从1开始,没有统计第一个字符,直接从第二个字符开始对比

else cnt=1;  如果前一个字符不等于现在这个字符,那么从现在这个字符开始重新计数

if(cnt==k){...}  每判断一个字符就会进行一次比较,看看符合出现的次数吗

如果符合就直接cout<<s[i];输出这个字符,然后return 0;结束程序

cout<<"No";  从头扫描到尾都没有找到合适的字符,输出No

注意:输出yes与no这样的英文单词时候,一定要注意大小写的情况


补充

在算法竞赛中,字符串是一种常用的数据类型,具有多种应用和处理方式。以下是字符串的用法及处理手段的条理清晰说明:

字符串的用法

  1. 表示文本信息:用于存储和处理文本数据,如单词、句子、段落等。

  2. 模式匹配:在文本中查找特定模式或子字符串。

  3. 文本比较:比较两个字符串的大小或判断是否相等。

  4. 文本转换:对字符串进行加密、解密、编码或解码等操作。

  5. 数据存储:以字符串形式存储结构化或非结构化的数据。

处理字符串的常用手段

  1. 遍历字符串

    • 逐字符处理:逐个访问字符串中的字符,进行操作如统计字符频率、转换大小写等。

    • 示例:统计每个字符在字符串中出现的次数。

  2. 字符串匹配

    • 暴力匹配:简单的逐字符比较,适用于小规模数据。

    • KMP算法:利用部分匹配表避免重复匹配,提高效率。

    • Boyer-Moore算法:从右向左匹配,跳过不可能匹配的部分,快速查找子字符串。

  3. 子字符串操作

    • 提取子字符串:根据起始和结束位置获取字符串的一部分。

    • 替换子字符串:将字符串中的特定部分替换为其他内容。

    • 分割字符串:按特定分隔符将字符串分割为多个子字符串。

  4. 字符串比较和排序

    • 字典序比较:根据字符的ASCII值进行比较,判断字符串的大小关系。

    • 自定义排序:根据特定规则对字符串数组进行排序,如按长度、按特定字符等。

  5. 字符串哈希

    • 计算哈希值:将字符串转换为哈希值,用于快速比较和查找。

    • 应用场景:检测字符串是否相同、查找重复字符串等。

  6. 动态规划

    • 最长公共子序列(LCS):通过动态规划找出两个字符串的最长公共子序列。

    • 编辑距离:计算将一个字符串转换为另一个字符串的最少操作次数。

  7. 前缀函数和KMP算法

    • 计算前缀函数:用于查找字符串中每个位置的最大相同前后缀长度。

    • 模式匹配:利用前缀函数实现高效的子字符串查找。

  8. 字符串编码和解码

    • Base64编码:将二进制数据转换为Base64编码的字符串。

    • URL编码:将特殊字符转换为可安全用于URL的形式。

  9. 正则表达式

    • 模式匹配:使用正则表达式定义复杂的匹配规则,查找符合条件的字符串。

    • 文本替换:根据正则表达式匹配的结果进行文本替换。

  10. 字符串的前缀和后缀处理

    • 前缀树(Trie):构建前缀树用于快速查找具有相同前缀的字符串。

    • 后缀数组:用于处理字符串的后缀相关问题,如查找最长重复子串。

  11. 字符串的反转和旋转

    • 反转字符串:将字符串中的字符顺序完全颠倒。

    • 旋转字符串:将字符串的一部分移到另一端,实现循环移位。

  12. 字符串的压缩和解压缩

    • Run-Length Encoding (RLE):通过统计连续重复字符的次数来压缩字符串。

    • 解压缩:将压缩后的字符串恢复为原始形式。

  13. 字符串的统计分析

    • 字符频率统计:统计每个字符在字符串中的出现次数。

    • 子字符串频率统计:统计特定子字符串在字符串中出现的次数。

  14. 字符串的加密和解密

    • 简单加密算法:如凯撒密码、替换密码等。

    • 复杂加密算法:如AES、RSA等,用于保护字符串数据的安全。

  15. 字符串的输入和输出

    • 格式化输入:从输入流中读取字符串,处理不同格式的输入。

    • 格式化输出:将字符串以指定格式输出,如限制长度、添加前缀或后缀等。

### 匹配包含连续相同字符的文本行 要查找包含连续相同字符的文本行,可以使用正则表达式中的**反向引用**和**分组**功能。通过定义一个捕获组,并在后续位置引用该组的内容,可以实现对连续相同字符的匹配。 #### 基本匹配模式 若要查找包含**任意连续相同字符**(如 `aa`、`11`、`bb`)的行,可以使用如下正则表达式: ```regex \(.\)\1 ``` - `\(.\)` 表示匹配任意一个字符并将其捕获为一个组。 - `\1` 表示引用第一个捕获组的内容,即匹配与前一个字符相同的字符。 在 `grep` 中使用时,需要启用扩展正则表达式支持,命令如下: ```bash grep -E '(.)\1' filename ``` 此命令将输出文件中所有包含至少两个连续相同字符的行。 #### 查找特定数量的连续相同字符 若要查找包含**至少三个连续相同字符**的行,可以使用量词 `{n,}` 来限定重复次数: ```regex \(.\)\1{2,} ``` 在 `grep` 中的使用方式如下: ```bash grep -E '(.)\1{2,}' filename ``` - `(.)` 捕获任意一个字符。 - `\1{2,}` 表示该字符至少重复两次,即总共连续出现三次或以上[^2]。 #### 示例 假设文件 `filename` 内容如下: ``` hello aaa abcc 1111 test ``` 运行以下命令: ```bash grep -E '(.)\1{2,}' filename ``` 输出结果为: ``` aaa 1111 ``` 这些行中包含至少三个连续相同的字符。 #### 排除特定字符连续出现 如果希望排除某些字符(如空格或标点符号)的连续出现,可以使用字符类限制匹配范围。例如,仅匹配**字母或数字的连续出现**: ```regex ([a-zA-Z0-9])\1{2,} ``` 对应的 `grep` 命令为: ```bash grep -E '([a-zA-Z0-9])\1{2,}' filename ``` 此命令确保仅匹配字母或数字的连续重复情况。 --- ### 相关问题 1. 如何使用正则表达式匹配连续递增或递减的数字序列? 2. 如何在 Linux 中使用 `grep` 查找包含重复单词的行? 3. 正则表达式如何检测字符串中是否存在非连续但重复的字符? 4. 如何使用 Python 正则表达式查找包含重复模式的文本行? ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值