• 【C语言刷LeetCode】1371. 每个元音包含偶数次的最长子字符串(M)


    给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好出现了偶数次。

    示例 1:

    输入:s = "eleetminicoworoep"
    输出:13
    解释:最长子字符串是 "leetminicowor" ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。
    示例 2:

    输入:s = "leetcodeisgreat"
    输出:5
    解释:最长子字符串是 "leetc" ,其中包含 2 个 e 。
    示例 3:

    输入:s = "bcbcbc"
    输出:6
    解释:这个示例中,字符串 "bcbcbc" 本身就是最长的,因为所有的元音 a,e,i,o,u 都出现了 0 次。
     

    提示:

    1 <= s.length <= 5 x 10^5
    s 只包含小写英文字母

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/find-the-longest-substring-containing-vowels-in-even-counts
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    偶数次,想到异或。

    每个元音,即多个元素如何组成一个一个元素来判断,我们想到bit位。

    以上两个关键小技巧找到后,就发现这道题跟之前的题很相似了,前缀和+uthash:

    1. typedef struct {
    2. int key;
    3. int val;
    4. UT_hash_handle hh;
    5. } UT_HASH;
    6. void GetState(char schar, int *state)
    7. {
    8. switch(schar) {
    9. case 'a':
    10. *state ^= 1;
    11. break;
    12. case 'e':
    13. *state ^= 1<<1;
    14. break;
    15. case 'i':
    16. *state ^= 1<<2;
    17. break;
    18. case 'o':
    19. *state ^= 1<<3;
    20. break;
    21. case 'u':
    22. *state ^= 1<<4;
    23. break;
    24. }
    25. return;
    26. }
    27. int findTheLongestSubstring(char * s){
    28. UT_HASH *hash_table = NULL;
    29. UT_HASH *tmp = malloc(sizeof(UT_HASH));
    30. int len = strlen(s);
    31. int i;
    32. int state = 0;
    33. int ret = 0;
    34. tmp->key = 0; // 状态值
    35. tmp->val = -1; // 索引
    36. HASH_ADD_INT(hash_table, key, tmp);
    37. for (i = 0; i < len; i++) {
    38. GetState(s[i], &state);
    39. tmp = NULL;
    40. HASH_FIND_INT(hash_table, &state, tmp);
    41. if (tmp != NULL) {
    42. ret = fmax(ret, i - tmp->val);
    43. } else {
    44. UT_HASH *new = malloc(sizeof(UT_HASH));
    45. new->key= state;
    46. new->val = i;
    47. HASH_ADD_INT(hash_table, key, new);
    48. }
    49. }
    50. return ret;
    51. }

  • 相关阅读:
    Django框架web开发实战: 安装django并完成一个小demo(一)
    Linux常用的一些shell脚本操作记录
    FineReport智能数据图表- 文本域控件
    P3871 [TJOI2010]中位数
    数学建模方法-优劣解距离法(TOPSIS法)
    Squid服务
    [java毕业设计源代码]精品微信小程序校园论坛系统|前后分离VUE[包运行成功]
    【C++11】列表初始化
    Linux IIC 驱动实验
    《程序是怎样跑起来的》读书笔记1——对程序员来说CPU是什么
  • 原文地址:https://blog.csdn.net/jin615567975/article/details/125495204