交換字元使得字串相同

2021-10-22 13:35:03 字數 1311 閱讀 1476

有兩個長度相同的字串s1 和s2,且它們其中只含有字元」x」 和」y」,你需要通過「交換字元」的方式使這兩個字串相同。

每次「交換字元」的時候,你都可以在兩個字串中各選乙個字元進行交換。

交換只能發生在兩個不同的字串之間,絕對不能發生在同乙個字串內部。也就是說,我們可以交換s1[i] 和s2[j],但不能交換s1[i]和s1[j]。

最後,請你返回使s1和s2相同的最小交換次數,如果沒有方法能夠使得這兩個字串相同,則返回-1。

輸入:s1 = 「xx」, s2 = 「yy」

輸出:1

解釋:交換 s1[0] 和 s2[1],得到 s1 = 「yx」,s2 = 「yx」。

輸入:s1 = 「xy」, s2 = 「yx」

輸出:2

解釋:交換 s1[0] 和 s2[0],得到 s1 = 「yy」,s2 = 「xx」 。

交換 s1[0] 和 s2[1],得到 s1 = 「xy」,s2 = 「xy」 。

注意,你不能交換 s1[0] 和 s1[1] 使得 s1 變成 「yx」,因為我們只能交換屬於兩個不同字串的字元。

輸入:s1 = 「xx」, s2 = 「xy」

輸出:-1

輸入:s1 = 「xxyyxyxyxx」, s2 = 「xyyxy***yx」

輸出:4

由於字串裡只有兩種字母 x 和 y,那麼如果我們統計位置的匹配情況,一共只有 4 種可能,即 x - x,x - y,y - x,y - y。

其中 x - x 和 y - y 都是已經能匹配的情況,我們不需要做操作。那麼剩餘的就是:

x - y,假設有 a 對。

y- x,假設有 b 對。

那麼對於兩對 x - y 或者 y - x,我們都是可以通過一次交換使得他們變為 x - x,y - y 的,而對於一對 x - y 和一對 y- x 的情況,我們需要通過 兩次 操作使他們變為 x - x,y - y(這也是示例一的情形)。所以我們會 優先使得兩對一樣的進行交換操作。

那麼這樣操作完以後,我們剩餘的情況有以下幾種:

1.a,b 都是偶數,那麼最後什麼都沒剩下,不需要額外操作了。

2.a,b 一奇一偶,最後只會剩下一對不匹配字元,這樣是無解的。

3.a,b 都是奇數,那麼最後會剩下一對 x - y 和一對 y - x,需要額外 2 次操作。

我們的主要計算代價是開頭統計的時候會遍歷字串,所以時間複雜度為 o(n)。

#includeusing namespace std;

int minimumswap(string str1,string str2)

1247 交換字元使得字串相同

有兩個長度相同的字串 s1 和 s2,且它們其中 只含有 字元 x 和 y 你需要通過 交換字元 的方式使這兩個字串相同。每次 交換字元 的時候,你都可以在兩個字串中各選乙個字元進行交換。交換只能發生在兩個不同的字串之間,絕對不能發生在同乙個字串內部。也就是說,我們可以交換 s1 i 和 s2 j ...

切割字串,使得子字串首尾相同的最小切割數

includeusing namespace std 給定乙個非空字串s,將s切割成若干個非空子串,要求每個子串頭尾是相同字元,給出切割子串的數量的最小的方法。int ans int max ac 75 版本 void fun string s,int cnt,int left,int right ...

交換字串

include include using namespace std void swap char a,char b 傳指標引用,傳入的是實參而不是形參,所以能夠實現交換 intmain 寫這個還發現乙個鬼畜的事情,vs2017不支援 char ap hey 這種寫法,看其他博主也遇到了這個問題,...