763文字部の分割

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。

示例 1:

输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
注意:

S的长度在[1, 500]之间。
S只包含小写字母'a'到'z'。

この質問は、開始する場所がわからない、力を見るために少し無知ですが、より良い例があります。

ストリング1を得観察部門、それが最初の文字に等しいが見出されたと推測に基づいて、最後の文字は、文字列全体、文字の最初の発生の最初の文字の最後に現れる位置と位置横断し、それらの間に分割されます文字列を切り出し、その後、後で分割左折。

次に、2番目の文字列を観察し、結果が見つからない、修正。文字列の末尾には「D」ではありませんが、「E」。唯一の同じ文字のフラグメントに現れ、彼らは文字列を切り開いたので、だけでなく、文字の内側の最大値で、文字の内側の最後の出現の最大位置を見つけるために、以前に得られた結果に応じて分割トラバース文字列の両端の一部門として。

class Solution {
    public List<Integer> partitionLabels(String S) {
    	List<Integer> list = new ArrayList<>();
    	for(int i = 0; i < S.length(); i++) {
            //遍历字符,找到字符最后出现的位置
    		int last = S.lastIndexOf(S.charAt(i));
    		int max = last;
    		for(int j = i; j <= max; j++) {
                //遍历字符和最后出现位置之间的字符,找到最后出现位置的最大值,用这个最大值更新遍历范围
    			max = Math.max(max, S.lastIndexOf(S.charAt(j)));
    			if(max == S.length()-1) {
    				break;
    			}
    		}
            //终点减起点加1就是范围
    		list.add(max - i +1);
            //i更新到遍历到的字符串末尾,整个过程看起来用了双重循环,但是只是对整个字符串遍历了一次
    		i = max;
    	}
    	return list;
    }
}

しかし、この解決策は、最後の呼び出しでは、我々は最後の登場、各文字の位置を格納するための新しい配列を宣言するようlastIndexOfでもが、そこに文字列を横断する位置の文字を見つけることがあるため、現時点で、長い時間を要するので、最後の位置を見つけます私たちは、文字列を横断しなければならなかったではないでしょう。

class Solution {
    public List<Integer> partitionLabels(String S) {
    	List<Integer> list = new ArrayList<>();
    	int[] last = new int[26];
        //用一个数组来存储每一个字符出现的最后位置
    	for(int i = 0; i < S.length(); i++) {
    		last[S.charAt(i) - 'a'] = i;
    	}
        //把字符串变成字符数组遍历
    	char[] chars = S.toCharArray();
    	for(int i = 0; i < chars.length; i++) {
    		int max = last[chars[i] - 'a'];
            //注意这里遍历的范围是要变动的
    		for(int j = i; j <= max; j++) {
    			max = Math.max(max, last[chars[j] - 'a']);
    			if(max == chars.length-1) {
    				break;
    			}
    		}
    		list.add(max - i +1);
    		i = max;
    	}
    	return list;
    }
}

おすすめ

転載: www.cnblogs.com/Jiewl/p/12591458.html