这道题和3. 无重复字符的最长子串 - 力扣(LeetCode)类似,因为题目中规定只有小写字母,所以定义统计数组时只需要定义26个字母即可,然后每次遍历的字符减去'a'即为他的下标
java
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
String ss = "lanqiobe";
TreeSet<String> ts = new TreeSet<String>();
int[] count = new int[26];
int corse = 0;
int maxcorse = 0;
int l = 0;
for (int r = 0; r < n; r++) {
count[s.charAt(r) - 'a']++;
corse = corse + s.charAt(r) - 'a' + 1;
while (count[s.charAt(r) - 'a'] >= 2) {
count[s.charAt(l) - 'a']--;
corse -= s.charAt(l) - 'a' + 1;
l++;
}
String sub = s.substring(l, r + 1);
int nowcount = corse + precount(sub);
if(nowcount>maxcorse) {
ts.clear();
ts.add(sub);
maxcorse = nowcount;
}else if(nowcount == maxcorse) {
ts.add(sub);
}
}
System.out.println(ts.first());
}
public static int precount(String sub) {
if (sub.contains("lanqiobe")) {
return 80;
} else if (sub.contains("lanqiob"))
return 70;
else if (sub.contains("lanqio"))
return 60;
else if (sub.contains("lanqi"))
return 50;
else if (sub.contains("lanq"))
return 40;
else if (sub.contains("lan"))
return 30;
else if (sub.contains("la"))
return 20;
else if (sub.contains("l"))
return 10;
else
return 0;
}
}