網(wǎng)站建設(shè)經(jīng)典范例萬網(wǎng)域名注冊(cè)查詢網(wǎng)
題目描述:
給定一個(gè)字符串s,最多只能進(jìn)行一次變換,返回變換后能得到的最小字符串(按照字典序進(jìn)行比較)。
變換規(guī)則:
交換字符串中任意兩個(gè)不同位置的字符。
輸入描述:
一串小寫字母組成的字符串s
輸出描述:
按照要求進(jìn)行變換得到的最小字符串
補(bǔ)充說明:
s是都是小寫字符組成
1<=s.length<=1000
示例
示例1
輸入:abcdef
輸出:abcdef
說明:abcdef已經(jīng)是最小字符串,不需要交換
示例2
輸入:bcdefa
輸出:acdefb
說明:a和b進(jìn)行位置交換,可以等到最小字符串
在Java中,我們可以實(shí)現(xiàn)一個(gè)函數(shù)來找到可以通過最多一次字符交換得到的字典序最小的字符串。以下是一個(gè)可能的實(shí)現(xiàn):
代碼實(shí)現(xiàn)
public class MinStringBySwap {public static String getMinStringBySwap(String s) {// 將字符串轉(zhuǎn)換為字符數(shù)組char[] chars = s.toCharArray();// 復(fù)制一份排序后的字符數(shù)組,用于比較char[] sortedChars = chars.clone();java.util.Arrays.sort(sortedChars);// 如果原字符串已經(jīng)是排序后的,直接返回if (java.util.Arrays.equals(chars, sortedChars)) {return s;}// 查找需要交換的字符位置int i = 0;while (i < chars.length && chars[i] == sortedChars[i]) {i++;}// 從后向前查找可以交換的字符位置int j = chars.length - 1;while (j > i && chars[j] != sortedChars[i]) {j--;}// 交換字符if (j > i) {char temp = chars[i];chars[i] = chars[j];chars[j] = temp;}// 將字符數(shù)組轉(zhuǎn)換回字符串并返回return new String(chars);}public static void main(String[] args) {// 測(cè)試示例1String s1 = "abcdef";System.out.println(getMinStringBySwap(s1)); // 輸出: abcdef// 測(cè)試示例2String s2 = "bcdefa";System.out.println(getMinStringBySwap(s2)); // 輸出: acdefb}
}
解釋
-
字符數(shù)組轉(zhuǎn)換和排序:
- 將輸入字符串轉(zhuǎn)換為字符數(shù)組
chars
。 - 復(fù)制一份字符數(shù)組并排序,得到
sortedChars
。
- 將輸入字符串轉(zhuǎn)換為字符數(shù)組
-
檢查是否已排序:
- 如果
chars
和sortedChars
相同,說明字符串已經(jīng)是字典序最小的,直接返回原字符串。
- 如果
-
查找交換位置:
- 使用變量
i
從前往后遍歷chars
,找到第一個(gè)與sortedChars
不匹配的字符位置。 - 使用變量
j
從后往前遍歷chars
,找到最后一個(gè)與sortedChars[i]
相等的字符位置。
- 使用變量
-
字符交換:
- 如果找到了合適的
i
和j
,則交換chars[i]
和chars[j]
。
- 如果找到了合適的
-
返回結(jié)果:
- 將交換后的字符數(shù)組轉(zhuǎn)換回字符串并返回。
這個(gè)算法的時(shí)間復(fù)雜度主要由排序步驟決定,為O(n log n),其中n是字符串的長度。空間復(fù)雜度為O(n),因?yàn)樾枰獜?fù)制一份字符數(shù)組進(jìn)行排序。