理解C转汇编后代码分析

题目

. - 力扣(LeetCode)

解题代码

cpp 复制代码
#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:B


void 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入参汇编指令

寄存器现状

三个数组分别打印

bash 复制代码
字符数组
x/9c $rdx
整形数组
x/26dw $r8
字符串数组
x/a $rdi #得到数组地址
x/16c 数组地址

通过bt也可印证

相关推荐
~yY…s<#>1 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
EricWang13583 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??3 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
希言JY4 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
午言若4 小时前
C语言比较两个字符串是否相同
c语言
TeYiToKu5 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
互联网打工人no16 小时前
每日一题——第一百二十四题
c语言
爱吃生蚝的于勒6 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~6 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
洋2406 小时前
C语言常用标准库函数
c语言·开发语言