• 【C语言刷LeetCode】763. 划分字母区间(M)


    字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

    示例:

    输入:S = "ababcbacadefegdehijhklij"
    输出:[9,7,8]
    解释:
    划分结果为 "ababcbaca", "defegde", "hijhklij"。
    每个字母最多出现在一个片段中。
    像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
     

    提示:

    S的长度在[1, 500]之间。
    S只包含小写字母 'a' 到 'z' 。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/partition-labels
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    26个字符记录左右边界,需要一个二维数组,特别注意不要漏了最后一组数据

    1. int* partitionLabels(char * s, int* returnSize){
    2. int i;
    3. int tmparr[26][2]; // 26个字符,左边界,右边界
    4. int *retarr;
    5. int cnt = 0;
    6. int len = strlen(s);
    7. int left = 0;
    8. int right = 0;
    9. int idx = 0;
    10. retarr = (int *)malloc(sizeof(int) * len);
    11. for (i = 0 ; i < 26; i++) {
    12. tmparr[i][0] = -1; // 初始化所有字符
    13. tmparr[i][1] = -1;
    14. }
    15. for (i = 0; i < len; i++) { // 根据字符串,赋值每个字符的左右边界位置
    16. idx = s[i] - 'a';
    17. if (tmparr[idx][0] != -1) {
    18. tmparr[idx][1] = i;
    19. } else {
    20. tmparr[idx][0] = i;
    21. tmparr[idx][1] = i;
    22. }
    23. }
    24. idx = s[0] - 'a';
    25. left = 0;
    26. right = tmparr[idx][1];
    27. for (i = 1; i < len; i++) {
    28. idx = s[i] - 'a';
    29. if (tmparr[idx][0] > right) { // 某个字符的左边界大于右边界
    30. retarr[cnt++] = right - left + 1; // 记录长度
    31. left = tmparr[idx][0]; // 重新更新左右边界
    32. right = tmparr[idx][1];
    33. } else if ((tmparr[idx][0] < right) && (tmparr[idx][1] > right)) {
    34. right = tmparr[idx][1]; // 仅仅更新右边界
    35. }
    36. }
    37. retarr[cnt++] = right - left + 1; // 不要漏了最后一组
    38. *returnSize = cnt;
    39. return retarr;
    40. }

  • 相关阅读:
    v3 + ts 商城项目的支付模块
    Android 第三方app https 抓包
    分布式事务处理:挑战与解决方案
    机器学习(四十五):使用Flask构建机器学习web
    css文字超出元素省略,单行、多行省略
    【数据结构】串
    从根儿上搞懂yolo
    docker下载mongo
    这可能是你进腾讯最后的机会了..
    重刷单调栈
  • 原文地址:https://blog.csdn.net/jin615567975/article/details/125550897