763. 划分字母区间(中等)

2024-06-03 11:12
文章标签 中等 划分 区间 字母 763

本文主要是介绍763. 划分字母区间(中等),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

763. 划分字母区间

  • 1. 题目描述
  • 2.详细题解
  • 3.代码实现
    • 3.1 Python
    • 3.2 Java

1. 题目描述

题目中转:763. 划分字母区间
在这里插入图片描述
在这里插入图片描述

2.详细题解

    划分字母片段,要求每个字母仅能出现在一个片段中,划分的片段数要最多。如果没有限制要最多的情况,那么划分一个片段即不划分任何新的片段即可,因此采用贪心策略:每个片段寻找最小的结束下标。
  直观思路: 寻找每个片段最小的结束下标的关键在于如何确保当前片段中的每个字母均已全部出现,因此需要记录每个字符总共出现的次数,当该片段所有字母均已出现即可判断找到最小的结束下标,即方法一:该方法首先需要遍历统计出所有字符出现的次数;其次遍历寻找最小结束下标,需要用到双指针,第一个指针(i)标记当前字符串的索引位置,第二个指针(cur_index)标记当前片段的索引位置。分为以下几种情况:1.新片段开始,当前字符计入片段,更新第一个指针位置移动1位;2.第二个指针cur_index与当前片段长度一致,即寻找到当前片段最小结束下标,第二个指针置为0;3.当前字符存在于当前片段中,减少该字符出现次数,更新第一个指针位置移动1位;4.第二个指针所指字符已全部包含在当前片段时,更新第二个指针位置移动1位;5.否则,当前字符加入当前片段,更新第一个指针位置移动1位。该方法较为直观,但实现有很多小细节,需要仔细区分各种情况的条件
   方法二:该方法不是方法一的直观思路,但却更易理解。对于每一个划分,都需要寻找最小结束下标(即该字符最后一个出现位置的索引),因此首先记录每一个字符最后一次出现位置的索引下标,当遍历一个字符时,即可找到满足该字符条件下最小的结束下标。具体的,使用三指针,一个指针标记当前遍历位置(i),剩下两个双指针标记当前片段的开始(left)与结束位置(right);当遍历一个字符c时,即可更新右指针right为max(right,c的结束位置),当遍历位置i和右指针right相遇时,即当前片段为满足条件的最小片段。

3.代码实现

3.1 Python

# 方法一:
from collections import Counter
class Solution:def partitionLabels(self, s: str) -> List[int]:word_dict = Counter(s)cur_queue = []cur_index = 0ans = []i = 0while i < len(s):c = s[i]if len(cur_queue) == 0:cur_queue.append(c)word_dict[c] -= 1i += 1elif len(cur_queue) == cur_index:ans.append(len(cur_queue))cur_index = 0cur_queue = []elif c in cur_queue:cur_queue.append(c)word_dict[c] -= 1i += 1elif word_dict[cur_queue[cur_index]] == 0:cur_index += 1else:cur_queue.append(c)word_dict[c] -= 1i += 1if len(cur_queue) > 0:ans.append(len(cur_queue))return ans

在这里插入图片描述

# 方法二
from collections import defaultdict
class Solution:def partitionLabels(self, s: str) -> List[int]:ans = []last_loc = defaultdict(int)for i,c in enumerate(s):last_loc[c] = ileft, right = 0, 0for i,c in enumerate(s):right = max(right, last_loc[c])if i == right:ans.append(right-left+1)left = right + 1return ans

3.2 Java

class Solution {public List<Integer> partitionLabels(String s) {List<Integer> ans = new ArrayList<>();Map<Character, Integer> lastLoc = new HashMap<>();for (int i = 0; i < s.length(); i++) {lastLoc.put(s.charAt(i), i);}int left = 0, right = 0;for (int i = 0; i < s.length(); i++) {right = Math.max(right, lastLoc.get(s.charAt(i)));if (i == right) {ans.add(right - left + 1);left = right + 1;}}return ans;}
}

在这里插入图片描述

  执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code

这篇关于763. 划分字母区间(中等)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026820

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

【中等】保研/考研408机试-二分查找(模板题)

二分查找就是在一个有序数组中查找某个值,以首端尾端的中点mid查找对比,mid与要查找的数进行对比,看落在哪个区间,在那个区间重新得到首端和尾端,进而得到新的mid值。 一、模板题 二分查找-I_牛客题霸_牛客网 class Solution {public:int search(vector<int>& nums, int target) {int left=0,right=nums.s

【uva】11536-Smallest Sub-Array(区间移动问题)

一个区间移动的问题,1A了,感觉没什么好说的。。 13975926 11536 Smallest Sub-Array Accepted C++ 0.809 2014-08-01 11:00:20 #include<cstdio>#include<cstring>#include<iostream>using namespace std;#define INF 1 << 30