LeetCode

 

题一(字符串,Hash map)

 

bool wordPattern(char * pattern, char * str){           //全文假设pattern第一个为‘a’
    bool ans = false;
    int i, j, k, flag = 1;
    int s_len = strlen(str);                            //需要判断的str的总长度
    char **pat = (char**)calloc(26, sizeof(char*));     //--------------
    for(i = 0;i < 26;++i)//                                             |--------->   指针数组:一个字母对应一个单词     如:**pat为‘a’   对应   *pat为“dog”
        pat[i] = (char*)calloc(s_len + 1, sizeof(char));//--------------
    if(s_len > 0)
    {
        char *temp = (char*)calloc(s_len + 1, sizeof(char));
        for(i = 0,j = 0, k = 0;i <= s_len&&k < strlen(pattern)&&flag;++i)
        {
            // str[i] == '\0'--> 为了比较最后一个单词
            if(str[i] == ' '||str[i] == '\0')          //---------------------【1】读取单词完毕,进入判断
            {
                // pattern串中该字符不是第一次出现↓-----------------------------当下一个仍为'a'
                if(strlen(pat[pattern[k] - 'a']) > 0)  //此处一般都成立
                {
                    if(strcmp(pat[pattern[k] - 'a'], temp) != 0)//------------如果pat[1] 与 temp不相同,即当pattern中已有的'a'对应的单词与str对应序号的单词不同 (strcmp()相同则返回零)
                    {//                                                            相同则跳过,继续比较str下一个单词
                        flag = 0;
                        break;                         //---------------------退出循环,不再判断,直接return ans = false,表示不符合条件
                    }
                }
                // pattern串中该字符第一次出现  ↓-------------------------------当下一个为'b'
                else
                {
                    // 这个for循环是为了解决pattern = "abba", str = "dog dog dog dog"这种str串单词全相等的情况
                    for(int m = 0;m < k;++m)
                        if(strcmp(pat[pattern[m] - 'a'], temp) == 0)
                        {
                            flag = 0;
                            break;
                        }
                    if(flag) pat[pattern[k] - 'a'] = temp;//------------------pattern前后字母不相同,则将 单词 录入到 pat对应的字母 
                }
                //------------------------------------------------------------给 temp 重新赋值
                temp = (char*)calloc(s_len + 1, sizeof(char));
                j = 0;
                ++k;//--------------------------------------------------------k表示pattern中对应字母的下标,k++轮到pattern的下一个
            }
            else temp[j++] = str[i]; //---------------------------------------temp每次存储对应序号的单词
        }
        // pattern串和str串都匹配到最后,并且最后一个单词也符合
        if(flag&&k >= strlen(pattern)&&i > s_len)
            ans = true;
    }
    return ans;
}
  • 数组指针里每个索引对应一个单词,其实就是哈希表(我理解的)

 


题二:寻找链表中倒数第k个节点

  • 双指针

使用两条相同的链表,如若要返回倒数第k个节点,则先让两条中的link①先前进k步,然后同时前进,当link①为空时,link①与link②相差k步,此时link②就是要寻找的节点

image.png

 

  • 使用栈解决

把原链表的结点全部压栈,然后再把栈中最上面的k个节点出栈,出栈的结点重新串成一个新的链表即可

(JAVA)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值