题目描述 给定一个 01 字符串 ss,你可以任选 ss 的一个非空子串,把这个子串在 ss 中翻转一次。 问你能得到字典序最小的字符串是什么? 形式化的,你可以选择一个区间 [l, r][l,r] 满足 1 \leq l \leq r \leq |s|1≤l≤r≤∣s∣,构造一个串 tt 满足: t_i = \begin{cases}s_i, &i < l \text{ 或 } i > r \\ s_{r - (i - l)}, & l \leq i \leq r\end{cases} t i ={ s i , s r−(i−l) , i<l 或 i>r l≤i≤r 这里字符串的下标从 11 开始。 最小化字符串 tt 的字典序。 输入格式 输入只有一行一个字符串,表示 ss。 输出格式 输出一行一个字符串,表示得到的字典序最小的字符串。c++代码
时间: 2024-04-16 11:25:28 浏览: 13
#include <iostream>
#include <string>
using namespace std;
string minLexicographicString(string s) {
string result = s;
int n = s.size();
for ( i = 0; i < n; i++) {
string t = s.substr(i) + s.substr(0, i);
if (t < result) {
result = t;
}
}
return result;
}
int main() {
string s;
cin >> s;
string result = minLexicographicString(s);
cout << result << endl;
return 0;
}
相关问题
题目描述 给定一个 01 字符串 ss,你可以任选 ss 的一个非空子串,把这个子串在 ss 中翻转一次。输入格式 输入只有一行一个字符串,表示 ss。 输出格式 输出一行一个字符串,表示得到的字典序最小的字符串。c++代码
你好!你可以尝试使用以下的C++代码来解决这个问题:
```cpp
#include <iostream>
#include <string>
using namespace std;
string getSmallestString(string s) {
int n = s.length();
int start = -1, end = -1;
for (int i = 0; i < n; i++) {
if (s[i] == '0') {
start = i;
break;
}
}
if (start == -1) {
// 如果没有0,直接返回原字符串
return s;
}
for (int i = n - 1; i >= 0; i--) {
if (s[i] == '1') {
end = i;
break;
}
}
// 将start到end之间的子串翻转
for (int i = start; i <= end; i++) {
if (s[i] == '0') {
s[i] = '1';
} else {
s[i] = '0';
}
}
return s;
}
int main() {
string s;
cin >> s;
string result = getSmallestString(s);
cout << result << endl;
return 0;
}
```
这段代码会读取一个01字符串,并返回得到的字典序最小的字符串。
题目描述 给定一个 01 字符串 ss,你可以任选 ss 的一个非空子串,把这个子串在 ss 中只可以翻转一次。输入格式 输入只有一行一个字符串,表示 ss。 输出格式 输出一行一个字符串,表示得到的字典序最小的字符串。c++代码
抱歉,之前的回答有误。下面是修正后的 C++ 代码,用于解决这个问题:
```cpp
#include <iostream>
#include <string>
using namespace std;
string getSmallestString(string s) {
int n = s.length();
int start = -1, end = -1;
// 找到第一个01的子串
for (int i = 0; i < n - 1; i++) {
if (s[i] == '0' && s[i+1] == '1') {
start = i;
end = i + 1;
break;
}
}
if (start == -1) {
// 如果没有01子串,直接返回原字符串
return s;
}
// 将start到end之间的子串翻转
while (start >= 0 && end < n && s[start] == '0' && s[end] == '1') {
s[start] = '1';
s[end] = '0';
start--;
end++;
}
return s;
}
int main() {
string s;
cin >> s;
string result = getSmallestString(s);
cout << result << endl;
return 0;
}
```
这段代码会读取一个01字符串,并返回得到的字典序最小的字符串。它会找到第一个01的子串,然后将该子串翻转。如果没有01子串,则直接返回原字符串。希望能对你有帮助!