热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Leetcode:EncodeStringwithShortestLength&&G面经

DP:InitiallyIthinkof1DDP,dp[i]standsfortheshorteststringoffirsticharacters,then:dp[i]minLe


Given a non-empty string, encode the string such that its encoded length is the shortest.

The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times.

Note:
k will be a positive integer and encoded string will not be empty or have extra space.
You may assume that the input string contains only lowercase English letters. The string
‘s length is at most 160.
If an encoding process does not make the string shorter, then do not encode it. If there are several solutions, return any of them is fine.
Example
1:

Input:
"aaa"
Output:
"aaa"
Explanation: There is no way to encode it such that it is shorter than the input string, so we
do not encode it.
Example
2:

Input:
"aaaaa"
Output:
"5[a]"
Explanation:
"5[a]" is shorter than "aaaaa" by 1 character.
Example
3:

Input:
"aaaaaaaaaa"
Output:
"10[a]"
Explanation:
"a9[a]" or "9[a]a" are also valid solutions, both of them have the same length = 5, which is the same as "10[a]".
Example
4:

Input:
"aabcaabcd"
Output:
"2[aabc]d"
Explanation:
"aabc" occurs twice, so one answer can be "2[aabc]d".
Example
5:

Input:
"abbbabbbcabbbabbbc"
Output:
"2[2[abbb]c]"
Explanation:
"abbbabbbc" occurs twice, but "abbbabbbc" can also be encoded to "2[abbb]c", so one answer can be "2[2[abbb]c]".


DP: 


Initially I think of 1D DP, dp[i] stands for the shortest string of first i characters, then:


dp[i] = minLen{dp[k] + encode(substring(k+1, i))}


then I realize that the second part encode(substring(k+1, i)) is actually the same with our dp problem. So it turns out the transfer function is


dp[i] = minLen{dp[k] + dp(substring(k+1, i))}


then 1D is not enough, I introduce the second dimension, which indicates the end. dp[i][j] is the shortest encoded string from i to j


But the hardest part of this problem is how to generate dp[i][j] from dp[i][k] and dp[k+1][j]


I‘ve thought about the cases like: 


dp[i][k] = 3[abc]   dp[k+1][j] = 2[abc],   then dp[i][j] = 5[abc]


dp[i][k] = 3[abc]   dp[k+1][j] = xyz,   then dp[i][j] = 3[abc]xyz


dp[i][k] = aabc   dp[k+1][j] = aabc,   then dp[i][j] = 2[aabc]


No idea what to implement this conveniently, so refer to idea  https://discuss.leetcode.com/topic/71963/accepted-solution-in-java


The idea is to firstly concantenate dp[i][k] and dp[k+1][j] directly to construct dp[i][j], and then check if there exist possible repeat patterns in the original substring s.substring(i, j+1) that could further shorten dp[i][j]


replaceAll function is really clever



 1 public class Solution {
2 public String encode(String s) {
3 if (s==null || s.length()==0) return "";
4 String[][] dp = new String[s.length()][s.length()];
5
6 for (int len=0; len) {
7 for (int i=0; i+len) {
8 int j = i + len;
9 String subStr = s.substring(i, j+1);
10 dp[i][j] = subStr; //initialize
11 if (len <4) continue;
12 for (int k=i; k) {
13 if (dp[i][k].length() + dp[k+1][j].length() < dp[i][j].length()) {
14 dp[i][j] = dp[i][k] + dp[k+1][j];
15 }
16 }
17
18 //check if subStr has repeat pattern
19 for (int k=i; k) {
20 String repeat = s.substring(i, k+1);
21 if (subStr.length()%(k-i+1)==0 && subStr.replaceAll(repeat, "").length()==0) {
22 String ss = subStr.length()/repeat.length() + "[" + dp[i][k] + "]";
23 if (ss.length() < dp[i][j].length())
24 dp[i][j] = ss;
25 }
26 }
27 }
28 }
29 return dp[0][s.length()-1];
30 }
31 }


Leetcode: Encode String with Shortest Length && G面经



推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
author-avatar
瓦尔登湖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有