描述:给定由小写字母组成的字符串source,尽可能多的把source切分为连续字符串,并使得每一个字母最多只能出现在一个子串中,返回各子串长度
样例:
输入:"ababcbacadefegdehijhklij"
输出:[9, 7, 8]
[9, 7, 8]分别对应子串"ababcbaca"、"defegde"、"hijhklij",满足每个子串中的字母都是唯一的
java:
public List<Integer> strSub(String source){
List<Integer> list=new ArrayList<Integer>();
if(source==null||source.length()==0) {
return list;
}
//map存放字符串中每个字符的位置
//由于map的key值唯一,最终得到每一个字符位置的最大值。
//如:map.put('a',0)将被map.put('a',8)覆盖
Map<Character, Integer> map=new HashMap<Character, Integer>();
char[] s=source.toCharArray();
for(int i=0;i<s.length;i++) {
map.put(s[i], i);
}
int left=0,right=0;
for(int i=0;i<s.length;i++) {
right=Math.max(right, map.get(s[i]));
if(right==i) {
list.add(right-left+1);
left=right+1;
}
}
return list;
}
python:
class strSub:
def str_sub(self,source):
list=[]#列表,append()添加元素
dict={}#字典,存放字符下标的最大值
for i in range(len(source)):
dict[source[i]]=i
left=0
right=0
for i in range(len(source)):
right=max(right,dict[source[i]])
if right==i:
list.append(right-left+1)
left=right+1
return list
if __name__=='__main__':
sub=strSub()
list=sub.str_sub('ababcbacadefegdehijhklij')
print(list)
:该题的主要突破点在,利用一个映射关系组将字符串中的每个字符(如'a')与对应的下标值(如0)保存起来(key—>value),该映射关系组的代码实现在java中是容器Map,在python中是字典dict,然后遍历该映射关系组,进行相应判断