这是一道某软上机题,来源不知,我经过一番周折写出,由于没有在网上看到,搜到这个题目(也可能是我搜索的方式不对),因此记录在这里,一是再次整理一次及保存自己的思路,二是在我自己看来我觉得我写的有一点繁琐,有待优化的地方,或者有其他更优的解法,由于我也没有这个题的所有测试用例,自己尝试了一些用例,皆是正确的,可能会有遗漏,欢迎对此题有见解的朋友批评指正,沟通交流
package cn.zz.jishi;
import java.util.ArrayList;
public class RGB {
/*
原题:
给一个字符串 由RGB(红绿蓝)3种字母组成
找出串中最长的相同子串,输出字母以及所在位置,然后剔除(如有多个相同拿最左的子串)
将剩余部分按序连接,如果只有一个字母则结束游戏,否则返回第一步
注意每次输出的位置为原始串中的位置
例:RBBGGR
B 2 3
G 4 5
R 1 6
我的思路:
利用沉岛思想,当我每遍历完一次时,把这次的结果的位置改为0,
比如"RBBGGGR",第一次遍历求出G 3 4 5,字符串变为 RBB000R,
第二次遍历时,得到 B 1 2,字符串变为R00000R以此类推...
至于如何找到每一轮遍历的结果,并且输出最长的
第一轮遍历
设定两个初始链表,maxlist(放置目前找到的最长的),curlist(放置当前在找的)
对应两个变量 max(找到的最长的多场) 和 currentmax(当前的多长)
设置两个字符变量 maxchar(找到的最长的那个对应的字符) 和 curchar(当前在找的的字符)
两个指针 begin end 分别指向相连字符的开头和结尾
第二次遍历
下面每一条语句都有注释,如果看不懂或者觉得有一点繁琐,那么用例子,纸上画画,或者debug跟着走一遍就清晰了
* */
public static void main(String[] args) {
findMax("RBBGGGR");
}
public static