有兩個長度相同的字串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 這種寫法,看其他博主也遇到了這個問題,...