天天看點

經典算法面試題目-判斷s2是否是s1的旋轉字元串(1.8)題目解答關鍵代碼:完整代碼:

Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., “waterbottle” is a rotation of “erbottlewat”).

假設你有一個isSubstring函數,可以檢測一個字元串是否是另一個字元串的子串。 給出字元串s1和s2,隻使用一次isSubstring就能判斷s2是否是s1的旋轉字元串, 請寫出代碼。

例如:”waterbottle”是”erbottlewat”的旋轉字元串。

題目說我們使用一次isSubstring函數就可以判斷s2是否是s1的旋轉字元串, 如果從原始字元串s1和s2直接入手肯定不行,因為它們根本不存在子串關系。 如果不斷地旋轉字元,然後調用isSubstring,又需要調用多次的isSubstring。 而且通過旋轉字元再判斷,可以直接用等号判斷,根本用不上isSubstring。

既然如此,我們就要考慮去改變原始字元串。要判斷a串是否是b串的子串, 一般情況下都會有b串長度大于a串,長度相等的話就直接判斷它們是不是相等的串了。 我們可以考慮把串s1變長,然後調用一次isSubstring判斷s2是否是s1變長後的子串, 如果是,就得出s2是s1的旋轉字元串。s1怎麼變長呢?無非就是s1+s1或是s1+s2, s2一定是s1+s2的子串,是以這樣做沒有任何意義。而s1+s1呢? 我們就上面的例子進行讨論:s1=waterbottle,s2=erbottlewat. 則:

很容易可以發現,s1+s1其實是把s1中每個字元都旋轉了一遍,而同時保持原字元不動。 比如waterbottle向右旋轉2個字條應該是:terbottlewa,但如果同時保持原字元不動, 我們得到的就是waterbottlewa,而terbottlewa一定是waterbottlewa的子串, 因為waterbottlewa隻是在terbottlewa的基礎上再加上一條原字元不動的限制。 是以s1+s1将包含s1的所有旋轉字元串,如果s2是s1+s1的子串,自然也就是s1 的旋轉字元串了。

首先,我們來了解一個函數:

a.find(b) 表示查找字元串a是否包含子串b,若查找成功,傳回按查找規則找到的第一個字元或子串的位置;若查找失敗,傳回npos,即-1(列印出來為4294967295)。

接下來,利用這個函數,我們可以很友善的寫出判斷s2是否是s1的旋轉字元串的代碼。

繼續閱讀