最近在网上看到一道关于字符串操作的算法题,不过原题的表述以及给出的数据都有问题.这里我给出修正后的题目:
题目:
设计一个方法 String encode(String str),对字符串str进行如下转换操作为一个新字符串:
逐个扫描str的每个字符,
1.若当前字符为'_',则添加"\UL"到新字符串; 否则:
2.若当前字符表示一大于0的数字N,且该字符不是最后一个字符,则将后继字符添加N+1次到新字符串;否则:
3.直接添加当前字符到新字符串.
并且用一个字符'_'将相邻的变换隔开
并设计一个String decode(String code)方法执行encode的逆操作,即将由encode(str)方法返回的字符串还原为str.
encode方法的设计没有任何难度,只需要把题目"直译"成程序代码就OK了,有难度的地方在于decode方法.注意到字符串中的字符在encode之后的新字符串中是由'_'分开的,并且原字符串中的每个字符只由这个字符串变换后的字符串以及其后继字符有关,因此我们很容易可以想到先将编码后的字符串按'_'分解成一系列字符串,其中每个字符串对应原字符串的一个字符,然后从后向前一个个求出其所表示的字符.算法的大体想法就是这样,只有一点要注意:类似"4_"这种数字后跟'_'的情形会被编码成一列连续的"_____",应该区分出这种情形并加以处理
.
其实如果对压缩算法有所了解的话,很容易看出这个题目其实是行程编码(
Run-Length Encoding
)的一个变形.
下面给出本题的代码:
java 代码
-
-
-
-
- import
java.util.Scanner;
- public
class
StringCode{
-
public
static
void
main(String[] args){
- Scanner s =
new
Scanner(System.in);
-
while
(
true
){
- String text =s.next();
-
if
(
"exit"
.equalsIgnoreCase(text))
break
;
- String code =encode(text);
-
boolean
flags =
true
;
-
try
{
-
if
(!decode(code).equals(text)) flags =
false
;
- }
catch
(IllegalStateException e){
- flags =
false
;
- }
-
if
(flags){
- System.out.println(
"Code :"
+code);
- }
-
else
{
- System.out.println(
"Error code :"
+code);
- }
- }
- }
-
private
static
final
String ESC_S =
"\\UL"
;
-
private
static
final
char
ESC_C = '_';
-
-
-
-
-
-
public
static
String decode(String str)
throws
IllegalStateException{
- StringBuilder sb =
new
StringBuilder();
-
char
next =
0xffff
;
-
int
end =str.length(), start;
-
while
(end>
0
){
-
if
(next==ESC_C&&str.charAt(end-
1
)==ESC_C){
-
for
(start =end -
1
;start>
0
&&str.charAt(start-
1
)==ESC_C;start--);
-
if
(start!=
0
) start ++;
- }
-
else
{
- start =str.lastIndexOf(ESC_C,end -
1
) +
1
;
- }
-
- String code =str.substring(start,end);
-
-
if
(code.equals(ESC_S)){
- next = ESC_C;
- }
-
else
if
(end-start==
1
){
- next = code.charAt(
0
);
- }
-
else
{
-
for
(
int
index =
0
;index
-
if
(code.charAt(index)!= next)
throw
new
IllegalStateException(
"Illegal code: ["
+start+
","
+end+
"]"
);
- next =(
char
)('
0
'+end-start-
1
);
- }
- sb.insert(
0
,next);
- end =start -
1
;
- }
-
return
sb.toString();
- }
-
-
-
-
-
public
static
String encode(String str){
- StringBuilder sb =
new
StringBuilder();
-
for
(
int
index =
0
;index
-
char
c =str.charAt(index);
-
-
if
(c==ESC_C){
- sb.append(ESC_S);
- }
-
else
if
(c>'
0
'&&c<='
9
'&&index+
1
-
char
next =str.charAt(index+
1
);
-
for
(
int
count =c-'
0
';count>=
0
;count--)
- sb.append(next);
- }
-
else
{
- sb.append(c);
- }
-
-
if
(index+
1
- }
-
return
sb.toString();
- }
- }
分享到:
- 2007-08-01 19:46
- 浏览 2784
- 评论(2)
- 论坛回复 / 浏览 (2 / 3957)
- 查看更多
相关推荐
在这一背景下,我们有一个目标字符串(通常代表一段文件内容)和一个模式字符串(可能是已知的病毒签名)。我们的任务是检查目标字符串中是否存在模式字符串,如果存在,则可能存在病毒感染。 常见的字符串模式匹配...
这些题目覆盖了字符串操作的基本概念,如遍历、比较、组合与排列、回文、字符串匹配以及数据类型转换。理解和掌握这些知识点对于提升编程技能和应对面试至关重要。在实际应用中,还需要注意性能优化、错误处理以及...
根据提供的文件信息,我们可以从中提炼出与C语言字符串操作相关的几个关键知识点: ### 字符串回文检测 #### 代码示例: ```c int fun(char ch[]) { int i, j, n, flag; for (n = 0; ch[n] != '\0'; n++); flag...
* 输入第一个字符串: * shao * 输入第二个字符串: * shaod * 最短编辑距离 * 1 (2)本题思路分析 * 定义两个字符串s1 ,s2 * 比较两字符串的某两个相同位置时:(例如s1[i] s2[j] 这时i=j)有三种办法 * 1.把...
1. **字符串操作**:熟悉字符串的基本操作,如遍历、查找、插入和删除。这是处理字符串问题的基础。 2. **循环与条件判断**:在遍历字符串时,需要通过循环来检查每个字符,同时用条件判断来确认当前字符是否与前一...
这个问题涉及到的主要知识点包括字符串操作、字典序比较以及基本的ASCII码理解。 首先,我们需要了解什么是字典序。在计算机科学中,字典序通常用于对字符串进行排序,就像我们在字典中查找单词一样。字典序是按照...
总之,"PTA 6-13 函数实现字符串逆序"是一个基础但重要的编程练习,它可以帮助你深入理解和熟练掌握字符串操作、函数设计以及算法效率分析。通过解决这类问题,你可以提高编程技能,为更复杂的算法和数据结构挑战...
包含面试中经常考的数据结构,算法以及字符串的操作等常见的面试问题,经典解答
本节我们将探讨一些常见的字符串算法题,包括字符串反转、将整数转换成字符串、字符串拷贝、字符子串删除等。这些算法题都是IT行业中非常重要的基础知识。 一、字符串反转算法 反转字符串是字符串处理中非常重要的...
麦克风没插好,本节没声音;...主要讲解了数组做参数,以及一些作业中要求做的一些字符串函数。 如果实在想学这一节内容,可以参照我们推出最新的VS2015的视频教程。 讲的内容基本是一样的,全套视频无损失。
- 使用C++标准库中的算法,如`std::sort`, `std::transform`等,可以简化字符串操作。 - 对于性能敏感的场景,了解底层的字符数组操作,能优化代码效率。 以上是C++字符串处理的基础知识,实际编程中还会遇到更多...
在JavaScript编程中,字符串处理是常见的任务之一,尤其是在面试或日常开发中,字符串算法题经常出现,考验开发者对字符串操作的熟练程度和逻辑思维能力。本篇将深入探讨标题所提及的"JS 两个字符串算法题",并结合...
- **操作**: 创建一个字符串`s`并调用`arc`方法对其进行排序,然后打印结果。 **3.1.2 排序方法** - **函数**: `arc`,接受一个字符串参数`s`。 - 将字符串分为两部分:前半部分`head`和后半部分`tail`。 - 对前...
在准备参加蓝桥杯竞赛的过程中,C++编程语言和算法是关键领域,特别是字符串操作,因为它们经常出现在各种算法题目中。本压缩包文件“蓝桥杯c++_蓝桥杯竞赛练习之算法提高题字符串比较”显然是为帮助参赛者提升这...
标题中的任务是“按照字符串顺序从小到大排序,删除重复字符”,这通常是一个字符串处理的问题,涉及到了排序算法和字符数组的操作。在这个问题中,我们可以看到一个简单的C语言程序实现,它使用冒泡排序对字符串中...
### KMP字符串匹配算法 #### 一、简介 KMP(Knuth-Morris-Pratt)算法是一...通过对next数组的构建以及高效匹配策略的设计,KMP算法成功解决了传统暴力匹配中存在的重复计算问题,成为字符串匹配领域的一个经典算法。
接下来,关于字符串操作的常见方法。在Python中,我们可以利用内置的字符串方法如`split()`用于分割字符串,`join()`将数组合并为字符串,`replace()`替换子串,`strip()`去除两侧的空白字符,以及`lower()`和`upper...
本资源摘要信息涵盖了计算机常见算法面试题,主要涉及链表、字符串操作、搜索算法等方面的知识点。下面是对标题、描述、标签和部分内容的详细解释: 标题:计算机常见算法面试题 该标题表明了这是一份计算机常见...
"华为od-华为od练习题之求字符串字符匹配-题库题解.zip" 这个标题表明,这是一个与华为OD(可能是Online Judge或者某种在线编程训练平台)相关的压缩包文件,其中包含了关于字符串字符匹配的练习题目及其解答。...