【ACWing 字符串排序II】

文章介绍了一个C++程序,该程序接收输入字符串,按照特定规则对其中的英文字母进行排序:字母从A到Z排序,不区分大小写,且保持原输入顺序。非字母字符保持原位。程序使用了稳定排序算法和自定义比较函数来处理字符串。

题目:

编写一个程序,将输入字符串中的字符按如下规则排序。

  • 规则 1:英文字母从 A 到 Z 排列,不区分大小写。如,输入:Type 输出:epTy
  • 规则 2:同一个英文字母的大小写同时存在时,按照输入顺序排列。如,输入:BabA 输出:aABb
  • 规则 3:非英文字母的其它字符保持原来的位置。如,输入:By?e 输出:Be?y

输入格式

输入包含多组测试数据。

每组数据占一行,包含一个字符串。

输出格式

每组数据输出一行结果,为按要求排序后的字符串。

数据范围

字符串长度不超过 1000,
每个输入最多包含 100 组数据。

输入样例:

A Famous Saying: Much Ado About Nothing (2012/8).

输出样例:

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    string str;
    
    while(getline(cin, str))//输入字符串
    {
        string cs;
        for(auto c : str)
        if(isalpha(c)) // 如果该字符为字母则加入到该字符串中
        cs += c;
      stable_sort(cs.begin(), cs.end(), [](char a,char b){
         return tolower(a) < tolower(b); 
      }); // 稳定排序,且将字母都看做是小写的,不会因字母本身的大小写而改变排序的顺序
      
      for(int i = 0, j = 0; i < str.size(); i ++ ) //输出排序后的字符串
      {
          if(isalpha(str[i])) cout << cs[j ++ ];
          else cout << str[i];
      }
      cout << endl;
      
    }
    
    return 0;
}

小总结:题解运用到了函数库里的函数,从而简洁地解决了问题,通过这道题学到了一个稳定排序的函数方法,以及如何自定义比较函数。

### 关于 AcWing 1302 的解析 目前提供的引用内容并未直接提及 AcWing 平台上的第 1302 题的具体信息。然而,通过分析已知的引用材料以及常见的算法竞赛题目类型,可以推测该题可能涉及某些特定的算法领域,例如递归、贪心、二分查找或其他经典问题。 #### 可能的方向与背景 AcWing 平台上编号为 1302 的题目通常会属于某一类经典的编程挑战,比如字符串处理、动态规划、图论或者数学问题。由于具体题目描述未提供,以下是基于常见算法竞赛类型的假设性解析: --- #### **假设方向一:字符串匹配** 如果 AcWing 1302 涉及字符串匹配,则可能需要使用 KMP 算法或 Z 函数来解决模式串在主串中的位置问题。KMP 算法的时间复杂度为 \(O(n+m)\),其中 \(n\) 和 \(m\) 分别为主串和模式串长度[^1]。 ```python def compute_lps(pattern): m = len(pattern) lps = [0] * m j = 0 for i in range(1, m): while j > 0 and pattern[i] != pattern[j]: j = lps[j - 1] if pattern[i] == pattern[j]: j += 1 lps[i] = j return lps def kmp_search(text, pattern): n, m = len(text), len(pattern) lps = compute_lps(pattern) matches = [] j = 0 for i in range(n): while j > 0 and text[i] != pattern[j]: j = lps[j - 1] if text[i] == pattern[j]: j += 1 if j == m: matches.append(i - m + 1) j = lps[j - 1] return matches ``` --- #### **假设方向二:贪心策略** 若 AcWing 1302 属于贪心问题,则需找到局部最优解并逐步扩展至全局最优解。例如,在分配资源或选择区间覆盖的情况下,可以通过排序加迭代的方式解决问题[^4]。 ```python def greedy_interval_selection(intervals): intervals.sort(key=lambda x: x[1]) # 按结束时间升序排列 count = 0 end_time = float('-inf') for interval in intervals: if interval[0] >= end_time: count += 1 end_time = interval[1] return count ``` --- #### **假设方向三:二分查找** 当 AcWing 1302 涉及数值范围内的目标值定位时,可采用二分查找方法降低时间复杂度。以下是一个通用的整数二分模板[^5]: ```python def binary_search(q, target): l, r = 0, len(q) - 1 while l < r: mid = (l + r) >> 1 if q[mid] < target: l = mid + 1 else: r = mid return l if q[l] == target else -1 ``` --- ### 总结 尽管当前无法确切得知 AcWing 1302 的具体内容,但从已有引用资料来看,其解决方案很可能依赖于上述提到的经典算法之一。建议访问 AcWing 官网查看官方题解或社区讨论区获取更详细的解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值