有关字典序输出

在算法书上看了一个字典序的算法,没有伪代码,想自己写一个,先构建简单的 仅包含12345的数列。

最好的情况是实现了三位的排序,这只能算是巧合而已,因为相当于构建的树只用后退一次,并且满足二叉树。

之后才发现并不是二叉树,随着位数相距末尾的距离增加,树的分叉呈级递增。

 

比如,三集的序列是

 

        2

  3    3    3

4 4  4 4 4 4

 

而再上一层,2应当为1的分叉,并有4种情况。

 

所以应当为分叉数依照层级线性递增。这样的树我还没有想好,可以用看余数的方式实现。

在C++中按字典序输出字母有多种场景,下面结合引用内容分别介绍不同场景下的实现方法。 ### 字母大小写全排列后按字典序输出 对于字母大小写全排列并按字典序输出的情况,可将输入字符串先全部转换为大写,然后通过递归生成所有可能的大小写组合。示例代码如下: ```cpp #include <bits/stdc++.h> using namespace std; string s; void f(int x, string ans) { if(x == s.size()) { cout << ans << endl; return; } f(x + 1, ans + s[x]); if(s[x] < '0' || s[x] > '9') f(x + 1, ans + (char)(s[x] + 32)); } int main() { cin >> s; transform(s.begin(), s.end(), s.begin(), ::toupper); f(0, ""); } ``` 此代码先将输入字符串`s`转换为大写,然后通过递归函数`f`生成所有可能的大小写组合并输出,由于先处理大写字母,所以输出是按字典序排列的[^1]。 ### 从文本中提取单词并按字典序输出 当需要从文本中提取单词并按字典序输出时,可使用`set`容器。`set`会自动对元素进行排序,默认按照字典序排列。示例代码如下: ```cpp #include <iostream> #include <string> #include <set> #include <sstream> using namespace std; set<string> dict; int main() { string s,buf; while(cin>>s) { for(int i=0;i<s.length();i++) { if(isalpha(s[i])) s[i]=tolower(s[i]); else s[i]=' '; } stringstream ss(s); while(ss>>buf ) dict.insert(buf); } for(set<string>::iterator it = dict.begin();it!=dict.end();++it) { cout<<*it<<"\n"; } return 0; } ``` 该代码从输入中读取字符串,将非字母字符转换为空格,然后使用`stringstream`提取单词并插入到`set`中,最后遍历`set`按字典序输出单词[^3]。 ### 按字典序输出符合前缀的单词 若要从已输入的英文语句中提取符合给定前缀的单词并按字典序输出,可先将输入语句中的单词提取出来,存储在`set`中,再找出符合前缀的单词。示例代码如下: ```cpp #include <iostream> #include <string> #include <set> #include <sstream> using namespace std; set<string> words; void extractWords(const string& input) { string s = input; for(int i = 0; i < s.length(); i++) { if(isalpha(s[i])) s[i] = tolower(s[i]); else s[i] = ' '; } stringstream ss(s); string buf; while(ss >> buf) words.insert(buf); } void outputWordsWithPrefix(const string& prefix) { bool first = true; for(const auto& word : words) { if(word.substr(0, prefix.length()) == prefix) { if(!first) cout << " "; cout << word; first = false; } } if(first) cout << prefix; cout << endl; } int main() { string input, prefix; getline(cin, input); cin >> prefix; extractWords(input); outputWordsWithPrefix(prefix); return 0; } ``` 此代码先从输入语句中提取单词并存储在`set`中,然后找出符合前缀的单词并按字典序输出,若没有符合的单词则输出前缀本身[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值