蓝桥杯字串统计

题目描述

在这里插入图片描述在这里插入图片描述

public class Main {
	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		int L = reader.nextInt();
		String S = reader.next();
		LinkedHashMap<String, Integer> memo = new LinkedHashMap<>();
		//将所有的情况以及出现的次数都记录在map集合里
		for (; L <= S.length(); L++) {
			for (int i = 0; i <= S.length() - L; i++) {
				String x = S.substring(i, i + L);
				int frep = memo.getOrDefault(x, 0);
				memo.put(x, frep + 1);
			}
		}
		// 获取出现的最大频率
		int maxFreq = Integer.MIN_VALUE;
		for (String in : memo.keySet()) {
			if (memo.get(in) > maxFreq) {
				maxFreq = memo.get(in);
			}
		}
		//移除出现次数小于最大值的数据
		Iterator<Map.Entry<String, Integer>> iterator = memo.entrySet().iterator();
		while (iterator.hasNext()) {
			Map.Entry<String, Integer> m = iterator.next();
			if (m.getValue()< maxFreq) {
				iterator.remove();
			}
		}
		//集合的长度,同时也是数组的长度
		int memoSize = memo.size();
		String[] res = new String[memoSize];
		int k = 0;
		// 最大的长度
		int maxLength = Integer.MIN_VALUE;
		for (Map.Entry<String, Integer> entry : memo.entrySet()) {
			//获取最大长度
			if(entry.getKey().length()>maxLength) {
				maxLength=entry.getKey().length();
			}
			//放进集合中
			res[k] = entry.getKey();
			k++;
		}
		// 只有一个结果
		if (memoSize == 1) {
			System.out.println(res[0]);
			return;
		}
		// 存在多个的话,直接输入第一个就ok(break)
		int resIndex = 0;
		for (int i = 0; i < memoSize; i++) {
			if (res[i].length() == maxLength) {
				resIndex = i;
				break;
			}
		}
		System.out.println(res[resIndex]);
	}
### 关于蓝桥杯竞赛中的字符串排序问题 在蓝桥杯竞赛中,字符串处理是一个常见考点,涉及排序、匹配以及动态规划等问题。以下是针对字符串排序的相关 C/C++ 实现及其解题思路。 #### 字符串排序的基本方法 对于字符串排序问题,通常可以采用标准库函数或者手动实现比较逻辑的方式完成。C++ 提供了 `std::sort` 函数,能够高效地对字符数组或字符串进行排序[^1]。如果需要自定义排序规则,则可以通过传递比较器来实现特定需求。 ```cpp #include <iostream> #include <algorithm> int main() { std::string str; std::cin >> str; // 使用默认升序排序 std::sort(str.begin(), str.end()); std::cout << "Sorted string: " << str << std::endl; return 0; } ``` 上述代码展示了如何利用 `std::sort` 对输入字符串按字典顺序进行升序排列。 #### 复杂字符串操作案例分析 某些情况下,题目可能不仅限于简单排序,还涉及到模式匹配或其他复杂条件下的调整。例如,在引用[2]中提到的一道题目,其核心是对两个字符串之间的差异进行统计并修改原字符串以满足目标状态的要求。具体实现如下: ```cpp #include <stdio.h> #include <stdlib.h> // 定义辅助函数用于解决问题 int solve(char *a, char *b) { int count = 0; while (*a) { while (*a && *a == *b) { a++; b++; } if (*a) { *a = (*a == '*') ? 'o' : '*'; *(a + 1) = (*(a + 1) == '*') ? 'o' : '*'; count++; } } return count; } int main() { char a[1002]; char b[1002]; scanf("%s", a); scanf("%s", b); printf("%d\n", solve(a, b)); return 0; } ``` 此程序片段实现了基于给定规则的字符串转换功能,并返回所需的最小步数[^2]。虽然该例子主要关注的是字符串替换而非传统意义上的排序,但它体现了灵活运用基础算法解决实际问题的能力。 #### 动态规划的应用 当遇到更复杂的字符串问题时,比如寻找两字符串间的最长公共子序列(LCS),则需引入动态规划的思想[^4]。下面给出一个简单的 LCS 计算模板: ```cpp #include <iostream> #include <vector> using namespace std; int lcs(string X, string Y, int m, int n) { vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(X[i-1]==Y[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j], dp[i][j-1]); } } return dp[m][n]; } int main(){ string s1="AGGTAB"; string s2="GXTXAYB"; cout<<lcs(s1,s2,s1.size(),s2.size())<<"\n"; return 0; } ``` 这段代码通过构建二维表格存储中间结果,最终得出最大长度值作为答案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blog_xsong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值