关注
第二题:
小明在学旋律,每段旋律都可以用字符串来表示,并且旋律的每个
字符的ASCALL码递增的
比如以下4段旋律 :
aaa
bcd
bcdef
zzz
现在就是要求,小明能够吧这些旋律拼接起来组成最长的旋律。
比如上述例子输出 11 最长的旋律为 aaabcdefzzz
这题看似简单,不就排个序,然后把第一个字符串的末尾字符小于第二个字符串首字符的两个字符串拼接起来就好了嘛,但是字符串之间可能出现交叉,比如 aaa bcd cdef 肯定是拼接cdef好而不是bcd。那么如何解决呢,这种最优解或最大路径问题,一般就要用到回溯法或者动态规划了。
回溯法就是走迷宫,遍历完所有路径,找出最优的那个路径就行
void nextMelody(vector<string> melodies, int n, int curLength) {
if (n == melodies.size()) {
return;
}
string curMelody = melodies[n];
curLength += curMelody.length();
maxLength = max(maxLength, curLength);
char curMelodyLastChar = curMelody[curMelody.length() - 1];
for (int i = n + 1; i < melodies.size(); i++) {
char nextMelodyFirstChar = melodies[i][0];
int cmp = curMelodyLastChar - nextMelodyFirstChar;
if (cmp <= 0 && curLength + lengthLeft[i] > maxLength) {
nextMelody(melodies, i, curLength);
}
}
}
这是一个递归的回溯剪枝,lengthLeft[]和maxLength 是全局变量,分别用于纪录原数组中还剩的字符串总长度和目前以查找的最优路径,剪枝的条件前str[末]<str[头]且当前最优路径+还剩路径>maxLength (否则就不考虑了,肯定最优已经出来了)
动态规划和回溯差不多 不过可以从后往前,这样可以节省很多重复的开销,不过要开辟N的额外空间。时间效率上都差不多
int dynamicSolver(vector<string>& str) {
//从后往前
int len = str.size();
//用于纪录路径最大和
int *dp=new int[len];
memset(dp, 0, sizeof(dp[0]));
int maxlength=0;
for (int i = len - 1; i >= 0; i--) {
for (int j = i; j < len ; j++)
{
if (i == len - 1)
{
dp[i] = str[i].size();
if (dp[i] > maxlength)
maxlength = dp[i];
}
else if (str[i][str[i].size() - 1] <= str[j][0])
{
dp[i] = max(dp[i], (int)(dp[j] + str[i].size()));
if (dp[i] > maxlength)
maxlength = dp[i];
}
}
}
return maxlength;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 如果中了500万,你会离职吗? #
55349次浏览 383人参与
# 技术岗笔试题求解 #
14952次浏览 218人参与
# 腾讯音乐26届实习 #
112110次浏览 784人参与
# 牛友故事会 #
153414次浏览 2519人参与
# 双非应该如何逆袭? #
15768次浏览 660人参与
# 你投递的公司有几家约面了? #
52368次浏览 366人参与
# 腾讯2025实习生招聘 #
14454次浏览 601人参与
# 两会劳动法放大招 #
13324次浏览 367人参与
# 我的省钱小妙招 #
3663次浏览 133人参与
# 打工人的精神状态 #
24337次浏览 415人参与
# 怎么防止在试用期被辞退 #
108760次浏览 844人参与
# 实习/项目/竞赛奖项,哪个对找工作更重要? #
46348次浏览 616人参与
# 携程求职进展汇总 #
175419次浏览 1174人参与
# 秋招盘点:机械人值得去的企业 #
63459次浏览 648人参与
# 电网笔面经互助 #
28251次浏览 291人参与
# 如果公司降薪,你会跳槽吗? #
50509次浏览 410人参与
# 你是如何准备春招的? #
20718次浏览 155人参与
# 机械人值得去的半导体企业 #
15991次浏览 152人参与
# 新凯来求职进展汇总 #
11806次浏览 61人参与
# 新年的第一句祝福 #
29799次浏览 362人参与
# 虾皮求职进展汇总 #
197356次浏览 1281人参与
# 你小时候最想从事什么职业 #
73469次浏览 1379人参与