题目
. - 力扣(LeetCode)
解题代码
#include <stdio.h>
#include "stdbool.h"typedef struct {int score;int index;int count;
} Record;
Record records[26] = {0};int totalScore(char *w) {int total = 0;for (int i = 0; i < strlen(w); ++i) {total += records[w[i] - 'a'].score;}return total;
}int cmp(char **w1, char **w2) {return totalScore(*w2) - totalScore(*w1);
}int maxScore = 0;
#define Max(A, B) A>B?A:Bvoid recur(char **words, int wordsSize, int s, Record *records) {for (int i = wordsSize - 1; i >= 0; --i) {char *word = words[i];if (word == NULL) {continue;}int totalScore = 0;Record tmp[26] = {0};bool canUse = true;for (int j = 0; j < strlen(word); ++j) {int index = word[j] - 'a';tmp[index].count++;if (tmp[index].count > records[index].count) {// printf("%s,%d\n", word, index);canUse = false;break;}totalScore += records[index].score;}if (canUse) {for (int k = 0; k < 26; ++k) {records[k].count -= tmp[k].count;}recur(words, i, totalScore + s, records);for (int k = 0; k < 26; ++k) {records[k].count += tmp[k].count;}}recur(words, i, s, records);}maxScore = Max(maxScore, s);
}int maxScoreWords(char **words, int wordsSize, char *letters, int lettersSize, int *score, int scoreSize) {maxScore=0;memset(records, 0, sizeof(records));for (int i = 0; i < scoreSize; ++i) {records[i].score = score[i];records[i].index = i;}for (int i = 0; i < lettersSize; ++i) {int index = letters[i] - 'a';records[index].count += 1;}qsort(words, wordsSize, sizeof(char *), cmp);recur(words, wordsSize, 0, records);return maxScore;}
int main() {char *a[]={"dog","cat","dad","good"};char b[]={'a', 'a', 'c', 'd', 'd', 'd', 'g', 'o', 'o'};int c[]={1,0,9,5,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0};int ret=maxScoreWords(a,sizeof(a)/sizeof(char *), b, sizeof(b), c,sizeof(c)/4);return ret;
}
用例中字符数组可用浏览器console 敲回车
调maxScoreWords入参汇编指令
寄存器现状
三个数组分别打印
字符数组
x/9c $rdx
整形数组
x/26dw $r8
字符串数组
x/a $rdi #得到数组地址
x/16c 数组地址
通过bt也可印证