給你一個字符串?s
?,請你判斷字符串?s
?是否存在一個長度為?2
?的子字符串,在其反轉后的字符串中也出現。
如果存在這樣的子字符串,返回?true
;如果不存在,返回?false
?。
示例 1:
輸入:s = "leetcode"
輸出:true
解釋:子字符串?"ee"
?的長度為?2
,它也出現在?reverse(s) == "edocteel"
?中。
示例 2:
輸入:s = "abcba"
輸出:true
解釋:所有長度為?2
?的子字符串?"ab"
、"bc"
、"cb"
、"ba"
?也都出現在?reverse(s) == "abcba"
?中。
示例 3:
輸入:s = "abcd"
輸出:false
解釋:字符串?s
?中不存在滿足「在其反轉后的字符串中也出現」且長度為?2
?的子字符串。
提示:
1 <= s.length <= 100
- 字符串?
s
?僅由小寫英文字母組成。
分析:將所有的兩位子串視為一個26進制的數,存在哈希表中。之后反向遍歷整個字符串,同樣將每2位字符轉為26進制的數,判斷是否在哈希表中出現過即可。
bool isSubstringPresent(char* s) {int l=strlen(s);if(l==1)return false;int temp=(s[0]-'a')*26+s[1]-'a',index=2;int num[10000]={0};num[temp]=1;while(index<l)temp=(temp%26)*26+s[index]-'a',num[temp]=1,index++;int xx=(s[l-1]-'a')*26+s[l-2]-'a';index=l-3;do{if(num[xx]==1)return true;if(index>=0){xx=(xx%26)*26+s[index]-'a',index--;}}while(index>=0);if(num[xx]==1)return true;return false;
}
?題解給出的位運算方法。本質上用一個32位整數的位關系來表示相鄰字符。由于只關心字符之間的順序關系,大小只需要26即可。
bool isSubstringPresent(char* s) {int h[26] = {0};int len = strlen(s);for (int i = 0; i + 1 < len; i++) {int x = s[i] - 'a';int y = s[i + 1] - 'a';h[x] |= (1 << y);if ((h[y] >> x) & 1) {return true;}}return false;
}//作者:力扣官方題解
//鏈接:https://leetcode.cn/problems/existence-of-a-substring-in-a-string-and-its-reverse/solutions/3016932/zi-fu-chuan-ji-qi-fan-zhuan-zhong-shi-fo-ra8p/
//來源:力扣(LeetCode)
//著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。