问题描述

给一个字符串(只包含小写字母),删除重复的字母,

使得每个字母只出现一次。返回的结果必须是字典顺序最小的。

举例:“bcabc" -> "abc", "cbacdcbc" -> "acdb"。

提示:stack、greed

解决本题的关键是如何使用贪心策略

下面C++的实现使用的是这样的策略:

令目标字符串为空,每增加一位就遍历a-z,根据条件来判断当前字符是否可以添加到目标字符串。

因为遍历顺序是字典顺序,因此只要符合条件即可判定该字符就是需要添加的字符。

贪心算法的思想就是选择局部最优的,以达到全局最优。而这样的策略符合贪心选择性质。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std; class Solution {
public:
string removeDuplicateLetters(string s) {
if(s.empty())
return "";
int pos1 = ,pos2,i;
char ch;
bool flag;
string s1;
//结束条件
while(pos1 < s.length())
{
//遍历26个字母
for(ch = 'a';ch <= 'z';++ch)
{
flag = true;
//判断当前字符是否已经存在于S1
if(s1.find(ch) != s1.npos)
{
if(ch == 'z')
pos1 ++;
continue;
} //判断当前字符是否在S->pos1之后
if((pos2 = s.find(ch,pos1)) == s.npos)
{
//如果最后一个都没找到
if(ch == 'z')
pos1 ++;
continue;
} //判断当前字符是否符合条件
for(i = pos1;i < pos2;++i)
{
//只要[pos1,pos2)中存在一个不符合的就退出
if(s.find(s[i],i + ) == s.npos && s1.find(s[i]) == s1.npos)
{
flag = false;
break;
}
}
if(flag)
{
s1.push_back(ch);
pos1 = pos2 + ;
break;
}
}
}
return s1;
}
};
 

LeetCode题目: Remove Duplicate Letters的更多相关文章

  1. [LeetCode] 316. Remove Duplicate Letters 移除重复字母

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  2. leetcode@ [316] Remove Duplicate Letters (Stack & Greedy)

    https://leetcode.com/problems/remove-duplicate-letters/ Given a string which contains only lowercase ...

  3. leetcode 316. Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  4. [LeetCode] Remove Duplicate Letters 移除重复字母

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  5. LeetCode Remove Duplicate Letters

    原题链接在这里:https://leetcode.com/problems/remove-duplicate-letters/ 题目: Given a string which contains on ...

  6. 【LeetCode】316. Remove Duplicate Letters 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【leetcode】316. Remove Duplicate Letters

    题目如下: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...

  8. Remove Duplicate Letters -- LeetCode

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  9. 贪心:leetcode 870. Advantage Shuffle、134. Gas Station、452. Minimum Number of Arrows to Burst Balloons、316. Remove Duplicate Letters

    870. Advantage Shuffle 思路:A数组的最大值大于B的最大值,就拿这个A跟B比较:如果不大于,就拿最小值跟B比较 A可以改变顺序,但B的顺序不能改变,只能通过容器来获得由大到小的顺 ...

随机推荐

  1. UVA 11125 Arrange Some Marbles

    dp[i][j][m][n][s]表示最初选择j个i号颜色大理石.当前选择n个m号颜色大理石.剩余大理石状态(8进制数状压表示)最开始没看出状压..sad #include <map> # ...

  2. Jquery操作属性选择器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. git回溯到指定版本

    git回溯到指定版本 git log命令查看仓库日志 然后使用git checkout 命令 例如回溯到上图中的版本 git checkout 12db5d6fd138922a8aaf2214c84c ...

  4. Java IO 学习(五)跟踪三个文件IO方法的调用链

    假设我们想要用Java读取一个二进制文件,有好几种方式,本文会选取其中比较典型的三种方式进行详细分析 0. 准备工作 安装openjdk-1.8.0.141(普通的jdk中涉及IO的很多代码是闭源的, ...

  5. POJ 1862 Stripies【哈夫曼/贪心/优先队列】

    Stripies Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18198   Accepted: 8175 Descrip ...

  6. 拓扑排序+数学+DP【p1685】游览

    Description 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!!于是 ...

  7. shell spool

    If you wish to use SQL*Plus Command-line , you'll simply issue the sqlplus command from your shell: ...

  8. docker网络及Dockerfile

    1.制作镜像 使用阿里的yum源,网址:https://opsx.alibaba.com/mirror,或者mirrors.aliyun.com,点击帮助,就会有弹框出来. docker pull c ...

  9. redis --- lua 脚本实现原子操作

    如题, 楼主的想法很简单, lua 脚本本身支持原子性, 所以把命令写进一个脚本就行, 当然后续还会优化才能放到生产上,例如缓存脚本 ,redis 本身会缓存执行过的脚本 ,这样速度更快, 再优化, ...

  10. (转)Unity3d通过Action注册事件,回调方法

    http://www.cnblogs.com/jisi5789/archive/2013/04/22/3036589.html using UnityEngine; namespace Liulala ...