关注
第二题:
小明在学旋律,每段旋律都可以用字符串来表示,并且旋律的每个
字符的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;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
03-29 15:34
门头沟学院 Java 
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 找工作,行业重要还是岗位重要? #
8060次浏览 105人参与
# 五一之后,实习真的很难找吗? #
46314次浏览 335人参与
# 盲审过后你想做什么? #
12823次浏览 115人参与
# 领导秒批的请假话术 #
10072次浏览 74人参与
# 小厂实习有必要去吗 #
42254次浏览 260人参与
# 设计人如何选offer #
98478次浏览 690人参与
# 外包能不能当跳板? #
22217次浏览 191人参与
# 五一假期,你打算“躺”还是“卷”? #
31855次浏览 443人参与
# 考研可以缓解求职焦虑吗 #
21335次浏览 252人参与
# 面试等了一周没回复,还有戏吗 #
115740次浏览 1076人参与
# 大疆的机械笔试比去年难吗 #
69676次浏览 603人参与
# 找工作前vs找工作后的心路变化 #
7223次浏览 64人参与
# 如果有时光机,你最想去到哪个年纪? #
43370次浏览 770人参与
# 硬件人,你被哪些公司给挂了 #
46806次浏览 723人参与
# 写简历别走弯路 #
714649次浏览 7850人参与
# 秋招前后对offer的期望对比 #
271692次浏览 2075人参与
# 应届生薪资多少才合理? #
3134次浏览 24人参与
# 你喜欢工作还是上学 #
37755次浏览 413人参与
# 每人推荐一个小而美的高薪公司 #
72873次浏览 1357人参与
# 如果不工作真的会快乐吗 #
101317次浏览 868人参与