字符重排

《算法竞赛入门经典》5.3.2字符重排
问题描述:输入一个字典(用******结尾),然后输入若干个单词,每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出(如果不存,输出:()。输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写字母组成,注意,字典中的单词不一定按照字典序排列。

样例输入:
tarp given score refund only trap work earn course pepper part
******
resco nfudre aptr sett oresuc

样例输出:
score
refund
part tarp trap
:(
course

程序代码如下,cpp文件形式

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


int exits(string,string);


int main()
{
	vector<string> dic;
	string word;
	cin>>word;
	while(word!="******"){
		dic.push_back(word);
		cin>>word;
	}
	//对字典进行排序
	sort(dic.begin(),dic.end());
	
	//输入待查询的词,#结束查询
	cin>>word;
	int flag=0;
	while(word!="#"){
		flag=0;
		for(size_t i=0;i<dic.size();i++){
			if(exits(word,dic[i])){
				cout<<dic[i]<<" ";
				flag=1;
			}
		}
		if(!flag){
			cout<<":(";
		}
		cout<<endl;
		cin>>word;
	}
	//输出字典
	cout<<"this is the dictonary:"<<endl;
	for(size_t i=0;i<dic.size();i++){
		cout<<dic[i]<<" ";
	}
	cout<<endl;
	return 0;
}


int exits(string word,string str)
{
	if(word.length()!=str.length()){
		return 0;
	}
	int flag=0;
	sort(word.begin(),word.end());
	sort(str.begin(),str.end());
	size_t i=0;
	for(i=0;i<word.length();){
		if(word[i]==str[i]){
			++i;
		}else{
			break;
		}
	}
	return (i==word.length())?1:0;
}


字符统计及重排是一个常见的编程问题,可以用Java来实现。下面是一个简单的例子: ```java import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; public class CharacterCountAndReorder { public static void main(String[] args) { String str = "Hello World!"; Map<Character, Integer> charCount = countCharacters(str); System.out.println("字符统计:"); for (Map.Entry<Character, Integer> entry : charCount.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } String reorderedStr = reorderCharacters(charCount); System.out.println("字符重排结果:" + reorderedStr); } // 统计字符串中每个字符的出现次数 public static Map<Character, Integer> countCharacters(String str) { Map<Character, Integer> charCount = new HashMap<>(); for (char c : str.toCharArray()) { charCount.put(c, charCount.getOrDefault(c, 0) + 1); } return charCount; } // 根据字符出现次数重新排列字符串 public static String reorderCharacters(Map<Character, Integer> charCount) { PriorityQueue<Character> maxHeap = new PriorityQueue<>((a, b) -> charCount.get(b) - charCount.get(a)); maxHeap.addAll(charCount.keySet()); StringBuilder reorderedStr = new StringBuilder(); while (!maxHeap.isEmpty()) { char c = maxHeap.poll(); int count = charCount.get(c); for (int i = 0; i < count; i++) { reorderedStr.append(c); } } return reorderedStr.toString(); } } ``` 运行以上代码,输出结果为: ``` 字符统计: H: 1 e: 1 l: 3 o: 2 : 1 W: 1 r: 1 d: 1 !: 1 字符重排结果:oooolrldHW! e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值