題目
給定兩個字串 s1 和 s2, 要求判定 s2 是否能夠被通過 s1 作迴圈移位 ( rotate )
得到的字串包含. 例如, 給定 s1 = aabcd 和 s2 = cdaa, 返回 true; 給定
s1 = abcd 和 s2 = acbd, 返回 false.
解法1
直接模擬, 對 s1 進行迴圈移位, 在判斷字串 s2 是否在移位後的字串中.
c**
#include
#include
intmain()
src[j] = tempchar;
if (strstr(src, des) == 0)
}
printf("no\n");
getchar();
return 0;
}
[c]view plain
copy
print?
#include
#include
int main()
src[j] = tempchar;
if (strstr(src, des) == 0)
} printf("no\n");
getchar();
return 0;
}
#include #include int main()解法2其實沒必要對 s1 進行真正的移位, 依次從 s1[0], s1[1], ... 開始比較, 如果 s1 的下標超出範圍, 就對src[j] = tempchar;
if (strstr(src, des) == 0)
} printf("no\n");
getchar();
return 0;
}
其取餘, 這樣就相當於延長字串 s1 了.
c**
#include
#include
intmain()
if (k == len_des)
}
printf("no\n");
getchar();
return 0;
}
[c]view plain
copy
print?
#include
#include
int main()
if (k == len_des)
} printf("no\n");
getchar();
return 0;
}
#include #include int main()解法3解法2通過取餘數的方法, 達到延長字串的目的, 當然這是一種偽延長, 我們也可以把if (k == len_des)
} printf("no\n");
getchar();
return 0;
}
s1 延長成 s1s1, 那麼對 s1 做迴圈移位所得到的字串都將是字串 s1s1 的子字串.
如果 s2 可以由 s1 迴圈移位得到, 那麼 s2 一定在 s1s1 上. 至此我們將問題轉換成考察
s2 是否在 s1s1 上, 可通過呼叫一次 strstr 函式得到結果.
總結
解法1直接模擬, 效率最低, 解法3是典型的空間換時間的做法, 解法2是解法1和解法3的折中,
既不需要額外的空間, 也不需要對字串做移動
本文出自:
字串移位包含問題
問題描述 給定兩個字串s1和s2,要求判定s2是否能夠被s1做迴圈移動得到的字串包含。如s1 aabcd和s2 cdaa,則s1迴圈移動後包含s2,返回true s1 abcd和s2 acbd,則s1迴圈移動後不包含s2,返回false 解題思路 1 可以發現,s1迴圈移動後的結果肯定包含在字串s1...
字串移位包含問題
本問題 於 程式設計之美 問題描述 給定兩個字串s1和s2,要求判定s2是否能夠被通過s1做迴圈移位 rotate 得到的字串包含。例如,給定s1 aabcd和s2 cdaa,返回true 給定s1 abcd和s2 acbd,返回false。下面有兩種解法,第一種是列舉法 第二種是用了一種技巧,實現...
字串移位包含的問題
字串移位包含的問題 給定兩個字串s1和s2,要求判斷s2是否能夠被s1做迴圈移位得到的字串包含,例如,給定s1 aabcd和s2 cdaa,返回true 給定s1 abcd和s2 acbd,返回false 在做這道題的時候我發現了乙個很容易出錯,但是去不容易找到原因。主要原因是我們對於全變數初始化位...