题一(字符串,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②就是要寻找的节点
-
使用栈解决
把原链表的结点全部压栈,然后再把栈中最上面的k个节点出栈,出栈的结点重新串成一个新的链表即可
(JAVA)