【算法与数据结构】763、LeetCode划分字母区间

文章目录

所有的LeetCode题解索引,可以看这篇文章------【算法和数据结构】LeetCode题解

一、题目

二、解法

思路分析:本题要求为:

  • 1.尽可能多的划分片段
  • 2.字母只能出现在一个片段中
  • 3.片段连接起来仍然是s(只做切割,不改变字母位置)

程序当中我们需要统计字母最后出现的位置,然后找到字符出现的最远边界,当i=最远边界时(从上图可以看出最远边界就是分割点),则找到了分割点。

程序如下:

cpp 复制代码
class Solution {
public:
	vector<int> partitionLabels(string s) {
		// 1.尽可能多的划分片段 2.字母只能出现在一个片段中 3.片段连接起来仍然是s(只做切割,不改变字母位置)
		vector<int> result;
		int left = 0;			// 片段的左边界
		int right = 0;			// 片段的右边界
		int hash[27] = { 0 };	// 构建字母哈希表
		for (int i = 0; i < s.size(); i++) {
			hash[s[i] - 'a'] = i;	// 统计字母最后出现的位置
		}		
		for (int i = 0; i < s.size(); i++) {
			right = max(right, hash[s[i] - 'a']); // 找到字符出现的最远边界
			if (i == right) {	// 如果i=最远边界,则找到分割点
				result.push_back(right - left + 1);
				left = i + 1;
			}
		}
		return result;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)。
  • 空间复杂度: O ( 1 ) O(1) O(1)。

三、完整代码

cpp 复制代码
# include <iostream>
# include <vector>
# include <algorithm>
# include <string>
using namespace std;

class Solution {
public:
	vector<int> partitionLabels(string s) {
		// 1.尽可能多的划分片段 2.字母只能出现在一个片段中 3.片段连接起来仍然是s(只做切割,不改变字母位置)
		vector<int> result;
		int left = 0;			// 片段的左边界
		int right = 0;			// 片段的右边界
		int hash[27] = { 0 };	// 构建字母哈希表
		for (int i = 0; i < s.size(); i++) {
			hash[s[i] - 'a'] = i;	// 统计字母最后出现的位置
		}		
		for (int i = 0; i < s.size(); i++) {
			right = max(right, hash[s[i] - 'a']); // 找到字符出现的最远边界
			if (i == right) {	// 如果i=最远边界,则找到分割点
				result.push_back(right - left + 1);
				left = i + 1;
			}
		}
		return result;
	}
};

int main() {
	string s = "ababcbacadefegdehijhklij";
	Solution s1;
	vector<int> result = s1.partitionLabels(s);
	for (vector<int>::iterator it = result.begin(); it < result.end(); it++) {
		cout << *it << ' ';
	}
	cout << endl;
	system("pause");
	return 0;
}

end

相关推荐
是十一月末3 分钟前
机器学习之KNN算法预测数据和数据可视化
人工智能·python·算法·机器学习·信息可视化
chenziang18 分钟前
leetcode hot100 路径总和
算法
lyx1426069 分钟前
leetcode 3083. 字符串及其反转中是否存在同一子字符串
算法·leetcode·职场和发展
茶猫_11 分钟前
力扣面试题 39 - 三步问题 C语言解法
c语言·数据结构·算法·leetcode·职场和发展
初学者丶一起加油14 分钟前
C语言基础:指针(数组指针与指针数组)
linux·c语言·开发语言·数据结构·c++·算法·visual studio
积兆科技1 小时前
从汽车企业案例看仓网规划的关键步骤(视频版)
人工智能·算法·汽车·制造
Lenyiin1 小时前
01.01、判定字符是否唯一
算法·哈希算法
闻缺陷则喜何志丹1 小时前
【C++动态规划】1458. 两个子序列的最大点积|1823
c++·算法·动态规划·力扣·最大·子序列·点积
三万棵雪松1 小时前
3.系统学习-熵与决策树
学习·算法·决策树
半盏茶香2 小时前
C语言勘破之路-最终篇 —— 预处理(上)
c语言·开发语言·数据结构·c++·算法