【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript-CSDN博客
JS、Java、C、C++、Python代码实现:
【华为OD】D卷真题100分: 单词接龙 JavaScript代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分: 单词接龙 Java代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分: 单词接龙 C语言代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分: 单词接龙 C++代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分: 单词接龙 python代码实现[思路+代码]-CSDN博客
题目描述:
单词接龙的规则是:可用于接龙的单词首字母必须要前一个单词的尾字母相同;当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。
现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,请输出最长的单词串,单词串是单词拼接而成,中间没有空格。
输入描述
输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N ;
输入的第二行为一个非负整数,表示单词的个数N;
接下来的N行,分别表示单词数组中的单词。
输出描述
输出一个字符串,表示最终拼接的单词串。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
0
6
word
dd
da
dc
dword
d
输出
worddwordda
说明
先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出worddwordda。
示例2
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
4
6
word
dd
da
dc
dword
d
输出
dwordda
说明
先确定起始单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出dwordda。
备注
单词个数N的取值范围为[1, 20];
单个单词的长度的取值范围为[1, 30];
7878688
+---+
3 | | ++ + +---|
| | | 3 + 6 + | + | +
| + | | + + + | + | +
| + | +---+ + + +++++ + + + | +
| + | + | + +----+ | | + + + | +
| + 3 | + | + + + 2 | | 2 + + + | +
| + | + | + + + | | + + + | +
| +---+ + | | | + ----+ | +---+ | | + | +
| | + | | | + | | | | | | + | +
| 1 | + | 8 | | + 1 | | | 1 | | 1 | | + | +
| | + | | | + | | | | | | | + | +
| +---+ + +---+ | ++---+ ++ +---+ +---+ | + | +
| | + | | | ++ | | |+ | +
|0 | + | 0 | 0 | ++ | 0 | |+ | +
| | + | | | ++ | | |+ | +
+---+ + +-------+ +---+| +|+ | +
+ + | +
0 1 2 3 4 5 6 7 8 9 10 11 12 + v: w u m u 1 0 2 4
题目解析:
按逻辑来实现,加上自定义排序来处理即可
代码实现:
#include <iostream>
#include <vector>
#include <string>
void wordsSort(std::vector<std::string>& ss) {
for (int i = 1; i < ss.size(); i++) {
for (int j = 0; j < ss.size() - i; j++) {
if (ss[j].length() < ss[j + 1].length()) {
std::swap(ss[j], ss[j + 1]);
}
else if (ss[j].length() == ss[j + 1].length() && ss[j] > ss[j + 1]) {
std::swap(ss[j], ss[j + 1]);
}
}
}
}
std::string calc(int index, std::vector<std::string>& ss) {
std::string retWrds = ss[index];
ss.erase(ss.begin() + index);
wordsSort(ss);
char last = retWrds.back();
while (!ss.empty()) {
int findWord = -1;
for (int i = 0; i < ss.size(); i++) {
if (last == ss[i].front()) {
findWord = 1;
retWrds = retWrds + ss[i];
ss.erase(ss.begin() + i);
last = retWrds.back();
}
if(findWord == 1){
break;
}
}
if (findWord == -1) {
return retWrds;
}
}
return retWrds;
}
int main() {
int index;
std::cin >> index;
int n;
std::cin >> n;
std::vector<std::string> ss;
for (int i = 0; i < n; i++) {
std::string s;
std::cin >> s;
ss.push_back(s);
}
std::cout << calc(index, ss) << std::endl;
return 0;
}