本题已有网友报告代码100%通过率
OJ &答疑服务
购买任意专栏,即可私信博主,获取答疑/辅导服务
OJ权限获取可以在购买专栏后访问网站:首页 - CodeFun2000
题目描述
给定一个字符串 s s s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。
变换规则:交换字符串中任意两个不同位置的字符。
输入描述
一串小写字母组成的字符串 s s s。 s s s是都是由小写字符组成, 1 ≤ s . l e n g t h ≤ 1000 1 \le s.length \le 1000 1≤s.length≤1000
输出描述
按照要求进行变换得到的最小字符串
样例1
输入
abcdef
输出
abcdef
说明: a b c d e f abcdef abcdef 已经是最小字符串,不需要交换
样例2
输入
bcdefa
输出
acdefb
说明: a a a 和 b b b 进行位置交换,可以等到最小字符串
思路:贪心
由于题目中说了最多只能交换一次,也就是可以不交换或者交换一次,从贪心的角度,那么一定选择字符串中最小的那一个字符作为整个字符串靠前的字符更优,如果出现多个相同的最小字符,那么显然应该选择最靠近字符串末尾的那一个。证明如下:
假设一个字符串,最小的字符用 ∗ * ∗表示,非最小的字符用 @ @ @表示,假设一个字符串可以写成如下形式: @ @ ∗ @ @ ∗ @@*@@* @@∗@@∗,那么可以枚举交换策略,如下:
源串: @ @ ∗ @ @ ∗ @@*@@* @@∗@@∗
策略一: ∗ @ @ @ @ ∗ *@@@@* ∗@@@@∗
策略二: ∗ @ @ ∗ @ @ *@@*@@ ∗@@∗@@
可以看到,第二种策略一定优于第一种策略,因为相同位置上,将更加靠后的最小字符交换靠前的字符会更优。
JavaScript代码
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let s = '';
rl.on('line', (line) => {
s = line;
const t = [...s].sort();
for (let i = 0; i < s.length; i++) {
if (s[i] !== t[i]) {
for (let j = s.length - 1; j >= 0; j--) {
if (s[j] === t[i]) {
s = s.substring(0, i) + s[j] + s.substring(i + 1, j) + s[i] + s.substring(j + 1);
break;
}
}
break;
}
}
console.log(s);
rl.close();
});
Python代码
s = input()
t = sorted(s)
for i in range(len(s)):
if s[i] != t[i]:
for j in range(len(s) - 1, -1, -1):
if s[j] == t[i]:
s = s[:i] + s[j] + s[i+1:j] + s[i] + s[j+1:]
break
break
print(s)
Java代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
char[] charArray = s.toCharArray();
char[] sortedArray = Arrays.copyOf(charArray, charArray.length);
Arrays.sort(sortedArray);
for (int i = 0; i < charArray.length; i++) {
if (charArray[i] != sortedArray[i]) {
for (int j = charArray.length - 1; j >= 0; j--) {
if (charArray[j] == sortedArray[i]) {
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
break;
}
}
break;
}
}
System.out.println(new String(charArray));
}
}
C++代码
#include <bits/stdc++.h>
using namespace std;
int main(void) {
string s;
cin >> s;
string t(s);
sort(t.begin(), t.end());
for (int i = 0; i < s.size(); i++) {
if (s[i] != t[i]) {
for (int j = s.size() - 1; j >= 0; j--) {
if (s[j] == t[i]) {
swap(s[i], s[j]);
break;
}
}
break;
}
}
cout << s << endl;
}