拼写单词

题目:
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的长度之和。
示例
示例 1:

输入:words = [“cat”,“bt”,“hat”,“tree”], chars = “atach”
输出:6
解释: 可以形成字符串 “cat” 和 “hat”,所以答案是 3 + 3 = 6。

示例 2:

输入:words = [“hello”,“world”,“leetcode”], chars = “welldonehoneyr”
输出:10
解释:可以形成字符串 “hello” 和 “world”,所以答案是 5 + 5 = 10。

思想: 用数组a[26]的下标对应字母的ASCII码值(统一减‘a’则a就会在0号下标存储),数组中存放出现次数,把词汇表和字母表中的次数进行比较即可。

  • 分别把词汇表和字母表中的字母出现次数存储到数组中。词汇表一个数组,字母表中的每个单词都需要一个数组,所以需要词汇表的数组循环和字母表的每个字母数组进行比较。
  • 若字母表中的出现次数大于词汇表的表示可以学习,则count++。
  • 不大于每次把count重新置为0,fin表示最后的字母个数。
  • 需要注意的是字母和词汇表进行比较时,词汇表的字母每次只能用一次,但不同字母之间可以多次,如: word[“hello”,“wl”] chars[ellhow] 最后的长度为7,可以看到总共需要3个l,但是字母表只有2个,原因是:字母表是大家共用的,不会因为hello用了2个ll,wl就没有l了,但如果是wlll那么就不行,因为字母表没有3个让你用,所以每次字母表和字母比较后不用变。
    举例如下:
    在这里插入图片描述
    根据思路,写出代码。
    代码:
int countCharacters(vector<string>& words, string chars) 
{
	int c[26]={0};
	int count=0;
	int fin=0;
	for(int i=0;i<chars.size();i++)
	{
		c[chars[i]-'a']+=1;//字母表字母出现次数存储。-a才可以从下标0开始存储
	}
	for(string s:words)//循环和词汇表的单词进行比较
	{
		
		int temp[26]={0};
		for(int i=0;i<s.length();i++)//循环判断是否可以表示字母中的每一个字符
		{
			temp[s[i]-'a']+=1;
			if(c[s[i]-'a']>=temp[s[i]-'a'])//大于表示可以表示
			{
				count++;
			}
			else
			{
				count=0;
				break;

			}	
		}
		fin+=count;//最后结果
		count=0;
	}
	return fin;
}
int main()
{
	vector<string>words;
	string chars="atach";
	words.push_back("cat");
	words.push_back("hat");
	words.push_back("tree");
	cout<<countCharacters(words,chars);
}

加油哦!🍭。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个简单的Java Swing实现字母拼写单词小游戏的代码示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SpellingGame extends JFrame implements ActionListener { // 单词列表 private String[] words = {"apple", "banana", "cherry", "orange", "pear"}; // 当前单词 private String currentWord; // 当前单词字母列表 private char[] currentLetters; // 当前字母序号 private int currentLetterIndex; // 游戏界面的组件 private JLabel wordLabel; private JTextField letterTextField; private JButton startButton; private JButton nextButton; public SpellingGame() { setTitle("字母拼写单词小游戏"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400, 150); setLocationRelativeTo(null); // 布局 setLayout(new GridLayout(3, 2)); // 单词标签 wordLabel = new JLabel("", JLabel.CENTER); add(wordLabel); // 字母输入框 letterTextField = new JTextField(10); letterTextField.setEnabled(false); add(letterTextField); // 开始按钮 startButton = new JButton("开始"); startButton.addActionListener(this); add(startButton); // 下一个字母按钮 nextButton = new JButton("下一个字母"); nextButton.setEnabled(false); nextButton.addActionListener(this); add(nextButton); setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource() == startButton) { // 开始游戏 currentWord = words[(int) (Math.random() * words.length)]; currentLetters = currentWord.toCharArray(); currentLetterIndex = 0; wordLabel.setText(currentWord.charAt(0) + ""); letterTextField.setEnabled(true); letterTextField.setText(""); startButton.setEnabled(false); nextButton.setEnabled(true); } else if (e.getSource() == nextButton) { // 检查当前字母是否正确 char currentLetter = currentLetters[currentLetterIndex]; char inputLetter = letterTextField.getText().toLowerCase().charAt(0); if (currentLetter == inputLetter) { // 字母正确,显示下一个字母 currentLetterIndex++; if (currentLetterIndex < currentLetters.length) { wordLabel.setText(wordLabel.getText() + currentLetters[currentLetterIndex]); letterTextField.setText(""); } else { // 所有字母拼写正确,显示恭喜信息 JOptionPane.showMessageDialog(this, "恭喜你,拼写正确!", "恭喜", JOptionPane.INFORMATION_MESSAGE); startButton.setEnabled(true); nextButton.setEnabled(false); letterTextField.setEnabled(false); } } else { // 字母错误,弹提示框 JOptionPane.showMessageDialog(this, "字母拼写错误!", "错误", JOptionPane.ERROR_MESSAGE); } } } public static void main(String[] args) { new SpellingGame(); } } ``` 该代码实现了一个简单的字母拼写单词小游戏,点击开始按钮后随机选择一个单词,只显示第一个字母,然后用户逐个输入其他字母,如果输入正确,就显示下一个字母,如果输入错误,就弹提示框。当所有字母拼写正确时,显示恭喜信息。玩家可以选择重新开始游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值