2021-10-14 力扣616 给字符串添加加粗标签

在这里插入图片描述

  • 看到题目时就想到了用strstr在字符串中查找字典中的字符串,因为strstr返回的是第一次出现的首地址,所以没想好怎么去找到Index,所以就停滞了,看了答案后恍然大悟,答案写的很巧妙,用返回的地址与字符串s的首地址做差再除以CHR类型的大小。
    index = (sptr - targetPtr)/sizeof(char);
  • 再一个就是找到了index后如何去利用。题目中要求对于能连续的子串要连续加粗,所以可以将字典中的所有出现的字符在原串S中做好标记,用flag[len]去做标记,以便后面遍历
  • 还有就是C语言怎么去拼接字符串,这里利用了sprintf做字符串拼接。
/*技巧: strstr找到地址后与起始地址相减在除以元素大小即得到Index*/

#define TAG_LEN 7

void SetFlag(char *s, char **words, int wordsSize, int *flag)
{
    for (int i = 0; i < wordsSize; ++i) {
        char *targetStrPtr = NULL;
        targetStrPtr = strstr(s, words[i]);
        while (targetStrPtr != NULL) {
            int index = (targetStrPtr - s) / sizeof(char); // 该计算得到index
            printf(" %s index is %d\n", words[i], index);
            int wordLen = strlen(words[i]);
            int left = index;
            while (left < index + wordLen) {
                flag[left++] = 1; // 将匹配到的子序列标记
            }
            targetStrPtr = strstr(targetStrPtr + 1, words[i]);
        }
    }
}
char *addBoldTag(char * s, char ** words, int wordsSize){
    int len = strlen(s);
    int *flag = (int*)malloc(sizeof(int) * len); //flag[i]表示s中该字符是否被words中的字符串匹配到
    memset(flag, 0x0, sizeof(int) * len);

    char *result = (char*)malloc(sizeof(char) * (len + TAG_LEN * len));
    memset(result, 0, len + TAG_LEN * len);
    int resultIndex = 0;

    SetFlag(s, words, wordsSize, flag);
    
    for (int i = 0; i < len; ++i) {
        //当第一个被标记或者当前被标记而前一个没有被标记
        if (flag[i] == 1 && (i == 0 || flag[i-1] == 0)) {
            sprintf(result, "%s<b>", result); // 注意这里是"%s<b>"而不是"<b>%s"
            resultIndex += 3;
        }
        result[resultIndex++] = s[i];
        if (flag[i] == 1 && (i == len - 1 || flag[i+1] == 0)) {
            sprintf(result, "%s</b>", result);
            resultIndex += 4;
        }
    }
    return result;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值