Leecode刷题C语言之字符串及其反转中是否存在同一子字符串
执行结果:通过
执行用时和内存消耗如下:
bool isSubstringPresent(char* s) {int i,len=strlen(s),end;for(i=0;i<len-1;i++){if(s[i]==s[i+1]) return true;for(end=len-1;end>1;end--){if(s[i]==s[end]&&s[i+1]==s[end-1]) return true;}}return false;
}
解题思路:
这段代码的目的是检查一个字符串 s
中是否包含 "ABAB" 类型的子串(即两个相同的字符紧接着另外两个相同的字符)。下面是详细的解题思路:
- 初始化变量:
i
:用于遍历字符串s
的每个字符。len
:存储字符串s
的长度。end
:用于从字符串s
的末尾向前遍历,以检查是否存在与s[i]
和s[i+1]
相同的连续字符对。
- 遍历字符串:
- 使用外层循环 (
for(i=0; i<len-1; i++)
) 遍历字符串s
的每个字符,直到倒数第二个字符。这样做是因为我们需要检查当前字符s[i]
和其后一个字符s[i+1]
是否相同,以及是否存在与之相同的字符对在字符串的其他位置。
- 使用外层循环 (
- 检查相邻字符是否相同:
- 在外层循环中,首先检查当前字符
s[i]
和其后一个字符s[i+1]
是否相同。如果相同,意味着已经找到了 "AA" 这样的子串,只需要在字符串的其他部分找到另一个 "AA" 子串即可确认存在 "ABAB" 类型的子串(这里假设s[i]
和s[i+1]
代表 "AA",而后续检查会验证是否存在另一个 "AA")。在这种情况下,直接返回true
。
- 在外层循环中,首先检查当前字符
- 在字符串的其余部分查找相同的字符对:
- 如果当前字符
s[i]
和其后一个字符s[i+1]
不相同,则进入内层循环 (for(end=len-1; end>i+1; end--)
) 从字符串的末尾向前遍历(注意,end
的初始值是len-1
,且每次循环end
都递减,但循环条件是end>i+1
,确保不会与外层循环中的i
和i+1
位置重叠)。 - 在内层循环中,检查是否存在
s[i] == s[end]
且s[i+1] == s[end-1]
的情况。如果找到这样的字符对,意味着在字符串s
中找到了 "ABAB" 类型的子串(其中s[i]
和s[i+1]
可以看作 "AB" 的一部分,而s[end]
和s[end-1]
是另一部分),此时返回true
。
- 如果当前字符
- 未找到符合条件的子串:
- 如果外层循环和内层循环都未能找到符合条件的子串,则函数最终返回
false
,表示字符串s
中不存在 "ABAB" 类型的子串。
- 如果外层循环和内层循环都未能找到符合条件的子串,则函数最终返回
总结:
这段代码通过两层循环遍历字符串 s
,检查是否存在由两个相同字符组成的连续对,并确认这样的对是否至少在字符串中出现两次(可以是重叠的,也可以是不重叠的),从而判断字符串 s
中是否包含 "ABAB" 类型的子串。