首页 > 其他分享 >[LeetCode] 3216. Lexicographically Smallest String After a Swap

[LeetCode] 3216. Lexicographically Smallest String After a Swap

时间:2024-10-30 10:01:51浏览次数:1  
标签:parity 3216 letters String int After 奇偶性 return

Given a string s containing only digits, return the lexicographically smallest string that can be obtained after swapping adjacent digits in s with the same parity at most once.

Digits have the same parity if both are odd or both are even. For example, 5 and 9, as well as 2 and 4, have the same parity, while 6 and 9 do not.

Example 1:
Input: s = "45320"
Output: "43520"

Explanation:
s[1] == '5' and s[2] == '3' both have the same parity, and swapping them results in the lexicographically smallest string.

Example 2:
Input: s = "001"
Output: "001"

Explanation:
There is no need to perform a swap because s is already the lexicographically smallest.

Constraints:
2 <= s.length <= 100
s consists only of digits.

交换后字典序最小的字符串。

给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的字典序最小的字符串。

如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5 和 9、2 和 4 奇偶性相同,而 6 和 9 奇偶性不同。

思路

注意交换的规则,两个数字只能同为奇数或者同为偶数才能互相交换。所以思路是从左往右遍历所有的字符,如果某两个相邻的字符 a 和 b (a 在左,b 在右) 具有相同的奇偶性且 a > b,则可以进行交换。照着这个思路,找到第一对符合条件的 a 和 b,即可交换并返回结果。为什么是第一对,是因为需要让字典序尽可能的小,你交换在后面的字符,字典序是不如交换第一对大的。

复杂度

时间O(n)
空间O(n)

代码

Java实现

class Solution {
    public String getSmallestString(String s) {
        int n = s.length();
        char[] letters = s.toCharArray();
        for (int i = 1; i < n; i++) {
            int a = letters[i - 1] - '0';
            int b = letters[i] - '0';
            if (helper(a, b) && a > b) {
                char temp = letters[i - 1];
                letters[i - 1] = letters[i];
                letters[i] = temp;
                return new String(letters);
            }
        }
        return s;
    }

    private boolean helper(int a, int b) {
        return a % 2 == b % 2;
    }
}

标签:parity,3216,letters,String,int,After,奇偶性,return
From: https://www.cnblogs.com/cnoodle/p/18515193

相关文章

  • string和初学指针和动态内存分配
    strcmp:原型定义于:<string.h>intstrcmp(constchar*str1,constchar* str2)比较的标准是ASCII从第一个字符开始比,直到遇到不同的字符或者返回NULL(0)若STR1[I]>STR2[I],返回1若STR1[I]<STR2[I],返回-1若STR1[I]=STR2[I],返回0strcpy:原型定义于<string.h>常用于字符串......
  • 【JavaSE】认识String类,了解,进阶到熟练掌握
    #1024程序员节|征文#下面就让博主带领大家一起解决心中关于String类的疑问吧~~~1.字符串构造:第一种和第二种(有一定的区别,在常量池上)publicstaticvoidmain(String[]args){//使用常量串构造Strings1="hello";System.out.println(s1);//直接newString对象S......
  • Java:String类(超详解!)
    一.常用方法......
  • Java学习第一天《String字符串的使用》
    1.获取字符最后一次出现的位置(函数返回值为int类型)                字符串的变量名.lastIndexOf(Stringstr);                               查找a最后出现的位置               System.out.print("请......
  • 【c++篇】:探索c++中的std::string类--掌握字符串处理的精髓
    ✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨✨个人主页:余辉zmh–CSDN博客✨文章所属专栏:c++篇–CSDN博客文章目录前言一.`std::string`对象的创建二.`std::string`对象的访问三.`std::string`对象的容量四.`std::string`对......
  • 字符串谁更快?String vs StringBuilder大比拼
    在Java中处理字符串,String和StringBuilder都是常用的类,它们的区别有点像在厨房里选择不同的工具:String就像是一把只能用一次的纸杯,改一次就得换新的;而StringBuilder就像一只可以反复使用的水杯,随时可以修改。这两个类各有优缺点,咱们一起来看看它们的区别和用法吧。String......
  • List<Map<String,Object>> 属性获取
    publicstaticvoidmain(String[]args){//1.数据准备List<Map<String,Object>>list=newArrayList<>();Map<String,Object>map=newHashMap<>();map.put("name","songwp");......
  • CF1158B The minimal unique substring
    这题是有迹可循的!下面从一个思考者的角度讲述解题方法。首先这两条限制很奇怪,但感觉都是很强的性质。所以这道题光想入手都是比较难的,先考虑怎么入手。第二条限制相对简单,先考虑第二条限制。我们注意到,如果一个串的数字全是\(1\),显然可以满足限制一。那限制二我们考虑将一个\(......
  • JVM(方法区包含常量池及StringTable)
    方法区(此图省略了栈等结构,JVM结构详细图在JVM简介中,方法区中常量池应为运行时常量池)定义方法区(MethodArea)是Java虚拟机(JVM)的一部分,它与Java堆一样,是被JVM实例中所有线程共享的区域。方法区在JVM启动时创建,可以选择固定大小或允许动态扩展。这个区域的大小直接影响到系统能够......
  • Java基于String类的题
    题目:字符串中的第一个唯一字符链接:387.字符串中的第一个唯一字符-力扣(LeetCode)给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。示例1:输入:s="leetcode"输出:0示例2:输入:s="loveleetcode"输出:2示例3:......