【算法千题案例】每日LeetCode打卡——96.写字符串需要的行数

????前言

???? 算法题 ????

???? 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程????

???? 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题

???? 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧????!

???? 今天是力扣算法题持续打卡第96天????!

???? 算法题 ????

????原题样例:写字符串需要的行数

我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行。


我们给定了一个数组 widths ,这个数组 widths[0] 代表 ‘a’ 需要的单位, widths[1] 代表 ‘b’ 需要的单位,…, widths[25] 代表 ‘z’ 需要的单位。


现在回答两个问题:至少多少行能放下S,以及最后一行使用的宽度是多少个单位?将你的答案作为长度为2的整数列表返回。

示例1:

示例 1:
输入: 
widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "abcdefghijklmnopqrstuvwxyz"
输出: [3, 60]
解释: 
所有的字符拥有相同的占用单位10。所以书写所有的26个字母,
我们需要2个整行和占用60个单位的一行。

示例2:

示例 2:
输入: 
widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "bbbcccdddaaa"
输出: [2, 4]
解释: 
除去字母'a'所有的字符都是相同的单位10,并且字符串 "bbbcccdddaa" 将会覆盖 9 * 10 + 2 * 4 = 98 个单位.
最后一个字母 'a' 将会被写到第二行,因为第一行只剩下2个单位了。
所以,这个答案是2行,第二行有4个单位宽度。

提示:

  • 字符串 S 的长度在 [1, 1000] 的范围。
  • S 只包含小写字母。
  • widths 是长度为 26的数组。
  • widths[i] 值的范围在 [2, 10]。


????C#方法:遍历

先遍历s,每行最后大于100重启一行

代码:

public class Solution {
    public int[] NumberOfLines(int[] widths, string s) {
         int[] res = new int[2];
            int num = 0;
            int n = 1;
            for (int i = 0; i < s.Length; i++)
            {
                if (100-num>= widths[s[i] - 'a'])
                {
                    num += widths[s[i] - 'a'];
                }
                else
                {
                    num = 0;
                    num += widths[s[i] - 'a'];
                    n++;
                }
                
            }
            res[0] = n;
            res[1] = num;
            return res;
    }
}

执行结果

通过
执行用时:128 ms,在所有 C# 提交中击败了90.00%的用户
内存消耗:39.4 MB,在所有 C# 提交中击败了70.90%的用户

????Java 方法:简单遍历

思路解析

我们从左到右遍历字符串 S 中的每个字母,并用二元组 (lines, width) 实时统计当前的答案。


当遍历到一个字母 x 时,如果 width + widths[x] <= 100,那么就更新 width 并保持 lines 不变;如果 width + widths[x] > 100,那么就将 lines 的值加 1,并将 width 置为 widths[x]。


代码:

class Solution {
    public int[] numberOfLines(int[] widths, String S) {
        int lines = 1, width = 0;
        for (char c: S.toCharArray()) {
            int w = widths[c - 'a'];
            width += w;
            if (width > 100) {
                lines++;
                width = w;
            }
        }

        return new int[]{lines, width};
    }
}

执行结果

通过
执行用时:0 ms,在所有 Java  提交中击败了100.00%的用户
内存消耗:36.3 MB,在所有 Java 提交中击败了75.50%的用户

复杂度分析

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

????总结

  • 今天是力扣算法题打卡的第九十六天!
  • 文章采用 C#Java 两种编程语言进行解题
  • 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
  • 那今天的算法题分享到此结束啦,明天再见!


上一篇:【算法千题案例】每日LeetCode打卡——95.唯一摩尔斯密码词


下一篇:【算法千题案例】每日LeetCode打卡——99.山羊拉丁文