全部评论
package wangyi_qiuzhao; import java.util.Scanner; public class Main3 { public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine(); char[] arr = line.toCharArray(); int res = 0; for (int i = 1; i < line.length(); i++) { if (arr[i-1] == arr[i]) {
reverse(arr, 0, i-1);
reverse(arr, i, arr.length-1);
}
} int sum = 1; for (int i = 1; i < arr.length; i++) { if (arr[i-1] != arr[i]) {
sum += 1; // System.out.println(sum); } else {
sum = 1;
} if (res < sum) {
res = sum;
}
}
System.out.println(res);
} public static void reverse(char[] arr, int start, int end) { while (start < end) { char temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
start++;
end--;
}
}
}
就是求s+s的最长黑白子串
就是两个子串相加然后求最长黑白子串,但是我牛客网没用过,写完了之后死活过不去,基本凉凉
当成一个环来做就可以。环本身不会发生变化。
你手撕123456一下就会发现,不管你怎么翻转,结果都是按序的,差别只在于倒序还是顺序 所以结果就是s+s,统计黑白相间个数
其他几题是什么来着 还有印象吗
void reverseString(string &str, int left, int right) { int i = left; int j = right; while (i < j) { swap(str[i], str[j]); i++; j--; } } int getSubStringLen(string & str) { if (str.size() <= 1) return str.size(); vector<int> v(str.size(), 0);//v[i]表示以str[i]结尾的最长黑白相间长度 v[0] = 1; for (int i = 1; i < str.size(); i++) { if (str[i] != str[i - 1])//若不相等,一直向下查找 v[i] = v[i - 1] + 1; else { if (str[i] == str[str.size() - 1] && str[i] == str[0])//当前节点与首节点和尾节点均相等则翻转后也不会改变长度 v[i] = 1; else //翻转 { reverseString(str, i, str.size() - 1); reverseString(str, 0, i - 1); v[i] = v[i - 1] + 1; } } } int min = 0; for (int i = 0; i < v.size(); i++) { if (v[i] > min) min = v[i]; } return min; }
AC,检查头尾两端是否相同,如果相同,直接统计最长序列;如果不相同,在中间找到相邻同颜色的作为分割点反转,统计最长序列;
怎么翻转都是s+s其中一个子串
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); in.close(); int len = s.length(); char[] ch = s.toCharArray(); ArrayList<Integer> index = new ArrayList<>(); for(int i=0;i<len-1;i++) { if(ch[i]==ch[i+1]) { index.add(i); } } if(index.size()==0) { System.out.println(len); return; } int max = index.get(0)+1; int[] value = new int[index.size()+1]; value[0] = max; for(int i=1;i<index.size();i++) { int length = index.get(i)-index.get(i-1); value[i] = length; max = Math.max(max, length); } max = Math.max(max, len-1-index.get(index.size()-1)); value[index.size()] = len-1-index.get(index.size()-1); if(ch[0]!=ch[len-1]) { max = Math.max(value[0]+value[index.size()], max); } int ii = 1; for(int i=1;i<index.size();i++) { int length = 0; if(ch[i]!=ch[len-1]) { length = value[index.size()]+value[ii]; } ii++; max = Math.max(max, length); } System.out.println(max); } } 刚刚写了下,跑了下测试用例,都能过,但是不知道其他能不能
相关推荐
点赞 评论 收藏
分享
05-05 17:44
门头沟学院 前端工程师 
点赞 评论 收藏
分享
03-26 22:55
门头沟学院 Java 点赞 评论 收藏
分享

点赞 评论 收藏
分享