careercup 陣列和字串1 8

2021-09-06 20:00:27 字數 1213 閱讀 2565

1.8 假定有乙個方法issubstring,可檢查乙個單詞是否為其他字串的子串。給定兩個字串s1和s2,請編寫**檢查s2是否為s1旋轉而成,要求只能呼叫一次issubstring。旋轉字串:」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. 則:

1

s1+s1=waterbottlewaterbottle

很容易可以發現,s1+s1其實是把s1中每個字元都旋轉了一遍,而同時保持原字元不動。 比如waterbottle向右旋轉2個字條應該是:terbottlewa,但如果同時保持原字元不動, 我們得到的就是waterbottlewa,而terbottlewa一定是waterbottlewa的子串, 因為waterbottlewa只是在terbottlewa的基礎上再加上一條原字元不動的限制。 因此s1+s1將包含s1的所有旋轉字串,如果s2是s1+s1的子串,自然也就是s1 的旋轉字串了。(注意思路就是如果s1與s2的長度相同,且要判斷s2是否是s1的子串,那麼s1只能與s2相等了。且s2如果是s1+s1的子串,那麼s2肯定也可以通過s1旋轉使得s2是s1的子串。)

c++實現**:

#include#include

using

namespace

std;

bool issubstring(string s1,string

s2)bool isrotate(string s1,string

s2)int

main()

careercup 陣列和字串1 1

1.1 實現乙個演算法,確定乙個字串的所有字元是否全部不同。假設不允許使用額外的資料結構,又該如何處理?c 實現 include include include using namespace std 判斷是否有重複字元 bool unqstring strings inti for i 0 i w...

careercup 陣列和字串1 6

1.6 給定一幅由n n矩陣表示的如下,其中每個畫素的大小為4個位元組,編寫乙個方法,將影象旋轉90度。不占用額外記憶體空間能否做到?類似leetcode rotate image 思路 我們這裡以逆時針旋轉為例 寫 時比較容易理解,順時針旋轉的實現思想相似 可以先將原矩陣以主對角線為對稱軸,交換主...

字串和字串陣列

字串陣列 include int main int argc,const char ar printf name1 s n name1 name1 zhangsan 部分初始化中,沒有被初始化的元素預設是0,0 對應的ascii值是 0 char name2 9 printf name2 s n n...