按字典顺序对字符串进行排序
Sorting a String in lexicographical order
该题提供了一个输入字符串和一个整数,它要求我们将字符串转换为所提供的输入整数指定长度的子字符串的所有可能组合。
然后我们必须从这些子字符串中找到最大值和最小值。
我找到了问题的解决方案,但谁能解释一下循环部分。
解决方案:
import java.io.*;`
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int k = sc.nextInt();
String maxString = s.substring(0, k);
String minString = s.substring(0, k);
for (int i = 1; i <= s.length() - k; ++i){
if (maxString.compareTo(s.substring(i, i + k)) < 0)
maxString = s.substring(i, i + k);
if (minString.compareTo(s.substring(i, i + k)) > 0)
minString = s.substring(i, i + k);
}
System.out.println(minString);
System.out.println(maxString);
}
}
这两个substring
将是开始
String maxString = S.substring(0, k); // start from index 0
String minString = S.substring(0, k);
在循环 for (int i=1;i<=S.length()-k;++i)
中,我们从 index=1
开始直到最后一个可能的索引 S.length()-k
,它仍然可以给我们一个长度为 k
.[=23 的子字符串=]
我们从索引0
(初始化部分)循环直到最后一个索引S.length() - k
(在循环中,最后一次迭代):
- 如果
substring
更大,我们进行更新 maxString = S.substring(i,i+k);
- 如果小于 minString,我们进行更新
minString = S.substring(i,i+k);
另外正如 Lino 和 jingx 提到的,我重构了你的代码如下:
public static void main(String... args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int k = sc.nextInt();
String maxString = s.substring(0, k);
String minString = s.substring(0, k);
for (int i = 1; i <= s.length() - k; ++i){
String curSubstr = s.substring(i, i + k);
System.out.println(curSubstr);
if (maxString.compareTo(curSubstr) < 0)
maxString = s.substring(i, i + k);
if (minString.compareTo(curSubstr) > 0)
minString = s.substring(i, i + k);
}
System.out.println(minString);
System.out.println(maxString);
}
进行本地测试如下:
Case #1
Input:
HelloWorld
2
Output:
el
ll
lo
oW
Wo
or
rl
ld
He // the min
rl // the max
该题提供了一个输入字符串和一个整数,它要求我们将字符串转换为所提供的输入整数指定长度的子字符串的所有可能组合。 然后我们必须从这些子字符串中找到最大值和最小值。
我找到了问题的解决方案,但谁能解释一下循环部分。 解决方案:
import java.io.*;`
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int k = sc.nextInt();
String maxString = s.substring(0, k);
String minString = s.substring(0, k);
for (int i = 1; i <= s.length() - k; ++i){
if (maxString.compareTo(s.substring(i, i + k)) < 0)
maxString = s.substring(i, i + k);
if (minString.compareTo(s.substring(i, i + k)) > 0)
minString = s.substring(i, i + k);
}
System.out.println(minString);
System.out.println(maxString);
}
}
这两个substring
将是开始
String maxString = S.substring(0, k); // start from index 0
String minString = S.substring(0, k);
在循环 for (int i=1;i<=S.length()-k;++i)
中,我们从 index=1
开始直到最后一个可能的索引 S.length()-k
,它仍然可以给我们一个长度为 k
.[=23 的子字符串=]
我们从索引0
(初始化部分)循环直到最后一个索引S.length() - k
(在循环中,最后一次迭代):
- 如果
substring
更大,我们进行更新maxString = S.substring(i,i+k);
- 如果小于 minString,我们进行更新
minString = S.substring(i,i+k);
另外正如 Lino 和 jingx 提到的,我重构了你的代码如下:
public static void main(String... args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int k = sc.nextInt();
String maxString = s.substring(0, k);
String minString = s.substring(0, k);
for (int i = 1; i <= s.length() - k; ++i){
String curSubstr = s.substring(i, i + k);
System.out.println(curSubstr);
if (maxString.compareTo(curSubstr) < 0)
maxString = s.substring(i, i + k);
if (minString.compareTo(curSubstr) > 0)
minString = s.substring(i, i + k);
}
System.out.println(minString);
System.out.println(maxString);
}
进行本地测试如下:
Case #1
Input:
HelloWorld
2
Output:
el
ll
lo
oW
Wo
or
rl
ld
He // the min
rl // the max