一、题目
二、代码
class Solution
{
//等同于射气球
public List<Integer> partitionLabels(String s)
{
int[][] record= new int[26][2];
LinkedList<Integer> return_list = new LinkedList<>();
int i;
int length;
length =record.length;
for(i=0;i<length;i++)
{
record[i][0] = -1;
record[i][1] = -1;
// System.out.println(" 一 "+record[i][0]+" 二 "+record[i][1]);
}
length = s.length();
int all_elements = 0;
// System.out.println("length " + length );
//构造出来的已经满足顺序
for(i=0;i<length;i++)
{
int temp = s.charAt(i) - 'a';
// System.out.println(" temp " +temp +" s "+s.charAt(i));
if(record[temp][0] ==-1)
{
record[temp][0] = i;
record[temp][1] = i;
all_elements++;
// System.out.println(" all_elements加一 " +i+" "+" all_elements "+all_elements);
}
else
{
record[temp][1] = i;
}
}
length =record.length;
// for(i=0;i<length;i++)
// {
// System.out.println(" 一 "+record[i][0]+" 二 "+record[i][1]);
// }
//数组构造完成 下面开始寻找无重叠区间
int[][] record_se= new int[all_elements][2];
// System.out.println(" all_elements "+all_elements);
int index = 0;
for(i=0;i<26;i++)
{
if(record[i][0]!=-1)
{
record_se[index][0] = record[i][0];
record_se[index++][1] = record[i][1];
}
}
// for(i=0;i<all_elements;i++)
// {
// System.out.println(" 一 "+record_se[i][0]+" 二 "+record_se[i][1]);
// }
Arrays.sort(record_se,(a,b)->
{
if(a[0] == b[0]) return Integer.compare(a[1],b[1]);
return Integer.compare(a[0],b[0]);
});
// System.out.println(" ");
// System.out.println(" 分割 ");
// System.out.println(" ");
// for(i=0;i<all_elements;i++)
// {
// System.out.println(" 一 "+record_se[i][0]+" 二 "+record_se[i][1]);
// }
int begin = record_se[0][0];
int end = record_se[0][1];
int cut_length = 0;
for(i=1;i<all_elements;i++)
{
// System.out.println(" begin " +begin);
// System.out.println(" end " +end);
if(record_se[i][0]>end)
{
// System.out.println(" 修改 " +end);
cut_length = end - begin+1;
begin = record_se[i][0];
end = record_se[i][1];
return_list.add(cut_length);
}
else
{
begin = Math.min(begin,record_se[i][0]);
end = Math.max(end,record_se[i][1]);
}
}
return_list.add(end - begin+1);
return return_list;
}
}
三、运行结果
四、附录
二刷
class Solution
{
public List<Integer> partitionLabels(String s)
{
int i;
int length = s.length();
int[][] record= new int[26][2];
//位置从1开始 因为0是初始值
for(i=0;i<length;i++)
{
int temp = s.charAt(i)-'a';
//System.out.println(" temp " + temp);
if(record[temp][0] != 0)
{
record[temp][1] = i+1;
}
else
{
record[temp][0] = i+1;
record[temp][1] = i+1;
}
}
//升序
Arrays.sort(record,(a,b)->
{
if(a[0] == b[0]) return Integer.compare(a[1],b[1]);
return Integer.compare(a[0],b[0]);
});
List<int[]> re_list = new LinkedList<>();
for(i=0;i<26;i++)
{
// System.out.print(" i "+i);
// System.out.print(" "+record[i][0]);
// System.out.println(" "+record[i][1]);
if(record[i][0] !=0)
{
//System.out.print(" 添加 ");
int[] temp = new int[2];
temp[0] = record[i][0];
temp[1] = record[i][1];
re_list.add(temp);
}
}
//System.out.println(" size "+re_list.size());
int begin = re_list.get(0)[0];
int end = re_list.get(0)[1];
int length_list = re_list.size();
//只要包含 就必然不可分割
List<Integer> res = new LinkedList<>();
for(i=1;i<length_list;i++)
{
if(re_list.get(i)[0] <end)
{
end = Math.max(end,re_list.get(i)[1]);
}
else
{
res.add(end-begin+1);
begin = re_list.get(i)[0] ;
end = re_list.get(i)[1] ;
}
}
res.add(end-begin+1);
return res;
}
}