关注
第二题:
小明在学旋律,每段旋律都可以用字符串来表示,并且旋律的每个
字符的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;
}
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 这个offer值得去吗? #
5047次浏览 83人参与
# 面试官拷打AI项目都会问什么? #
3773次浏览 180人参与
# 联宝杯大学生创新大赛,你的技术值得产业级答案 #
44052次浏览 505人参与
# 如果春招能重来,我会___ #
8167次浏览 92人参与
# 想做Agent可以做哪些岗位? #
4236次浏览 66人参与
# 你会因为行情,降低找工作标准吗? #
15505次浏览 165人参与
# 你觉得最好用的AI编程工具是_ #
1736次浏览 40人参与
# 你实习是赚钱了还是亏钱了? #
121258次浏览 676人参与
# 除了线上,还能去哪些地方投简历 #
4981次浏览 56人参与
# 机械制造公司求职体验 #
141656次浏览 386人参与
# 你和你的mentor相处模式是__ #
8356次浏览 69人参与
# 实习,不懂就问 #
213767次浏览 1704人参与
# 我与AI的日常 #
3954次浏览 23人参与
# 实习第一天,你在干什么 #
5418次浏览 45人参与
# 实习想申请秋招offer,能不能argue薪资 #
257706次浏览 1347人参与
# 你的实习什么时候入职 #
377527次浏览 2400人参与
# 如何排解工作中的焦虑 #
331987次浏览 2844人参与
# 你最满意的offer薪资是哪家公司? #
81659次浏览 386人参与
# mt对你说过最有启发的一句话 #
115456次浏览 875人参与
# 机械人晒出你的简历 #
191907次浏览 1108人参与
# 0经验如何找实习? #
92130次浏览 953人参与
