梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)
对字符串进行拼接、匹配、编码等操作,目标是最小化拼接代价、最大化匹配效率,每一步选择当前最优的字符串操作策略。
本教程以多个字符串处理贪心算法案例场景为例,让大家彻底理解以 “局部最优” 推导 “全局最优” 的核心逻辑,并掌握最优字符串拼接、贪心匹配算法的原理及代码实现。
问题描述:
例如,word1 = "abc" 且 merge = "dv" ,在执行此选项操作之后,word1 = "bc" ,同时 merge = "dva" 。
例如,word2 = "abc" 且 merge = "" ,在执行此选项操作之后,word2 = "bc" ,同时 merge = "a" 。
例如,word1 = "cab"和word2 = "abc" 且 merge = "" ,在执行此选项操作之后,word1 = "ab" ,同时 merge = "c",word2 = "abc" 。
示例:
算法解析:
#include <iostream>
using namespace std;
char* largestMerge(char * word1, char * word2) {
int m = strlen(word1), n = strlen(word2);
char *merge = (char *)malloc(sizeof(char) * (m + n + 1));
int i = 0, j = 0, pos = 0;
while (i < m || j < n) {
if (i < m && strcmp(word1 + i, word2 + j) > 0) {
merge[pos] = word1[i];
pos++, i++;
} else {
merge[pos] = word2[j];
pos++, j++;
}
}
merge[pos] = '\0';
return merge;
}
int main() {
char* word1="cabaa";
char* word2="bcaaa";
cout << "word1=" << word1 << endl;
cout << "word2=" << word2 << endl;
cout << "merge=" << largestMerge(word1, word2);
return 0;
}
word1=cabaa
word2=bcaaa
merge=cbcabaaaaa
问题描述:
示例1:
示例2:
示例2:
算法解析:
为了得到最晚有效时间,我们可以从高位向低位枚举,在保证时间有效的情况下,使得每一位尽可能取最大值。
#include <iostream>
using namespace std;
char* maximumTime(char* time) {
if (time[0] == '?') {
time[0] = ('4' <= time[1] && time[1] <= '9') ? '1' : '2';
}
if (time[1] == '?') {
time[1] = (time[0] == '2') ? '3' : '9';
}
if (time[3] == '?') {
time[3] = '5';
}
if (time[4] == '?') {
time[4] = '9';
}
return time;
}
int main() {
char time[] ="2?:?0";
cout << "time=" << time << endl;
cout << "max time=" << maximumTime(time);
return 0;
}
time=2?:?0
max time=23:50