`
Eastsun
  • 浏览: 309481 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

一个关于字符串操作的算法题

阅读更多

最近在网上看到一道关于字符串操作的算法题,不过原题的表述以及给出的数据都有问题.这里我给出修正后的题目:

题目: 设计一个方法 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 代码
  1. /**  
  2. *author: Eastsun  
  3. *version: 1.0 2007/8/1  
  4. */   
  5. import  java.util.Scanner;   
  6. public   class  StringCode{   
  7.      public   static   void  main(String[] args){   
  8.         Scanner s = new  Scanner(System.in);   
  9.          while ( true ){   
  10.             String text =s.next();   
  11.              if ( "exit" .equalsIgnoreCase(text))  break ;   
  12.             String code =encode(text);   
  13.              boolean  flags = true ;        //用于检测decode是否正确工作的标记   
  14.              try {   
  15.                  if (!decode(code).equals(text)) flags = false ;   
  16.             } catch (IllegalStateException e){   
  17.                 flags = false ;   
  18.             }   
  19.              if (flags){   
  20.                 System.out.println( "Code :"  +code);   
  21.             }   
  22.              else {   
  23.                 System.out.println( "Error code :"  +code);   
  24.             }   
  25.         }   
  26.     }   
  27.      private   static   final  String ESC_S =  "\\UL" ;   
  28.      private   static   final   char    ESC_C = '_';   
  29.        
  30.      /**  
  31.     *将编码后的字符串还原为原字符串  
  32.     *@throws IllegalStateException 如果参数str不是一个有效的编码字符串  
  33.     */   
  34.      public   static  String decode(String str) throws  IllegalStateException{   
  35.         StringBuilder sb = new  StringBuilder();   
  36.          char  next = 0xffff ;   
  37.          int  end =str.length(), start;   
  38.          while (end> 0 ){   
  39.              if (next==ESC_C&&str.charAt(end- 1 )==ESC_C){   
  40.                  for (start =end - 1 ;start> 0 &&str.charAt(start- 1 )==ESC_C;start--);   
  41.                  if (start!= 0 ) start ++;   
  42.             }   
  43.              else {   
  44.                 start =str.lastIndexOf(ESC_C,end - 1 ) + 1 ;   
  45.             }   
  46.                
  47.             String code =str.substring(start,end);   
  48.                
  49.              if (code.equals(ESC_S)){   
  50.                 next = ESC_C;   
  51.             }   
  52.              else   if (end-start== 1 ){   
  53.                 next = code.charAt( 0 );   
  54.             }   
  55.              else {   
  56.                  for ( int  index = 0 ;index
  57.                      if (code.charAt(index)!= next)  throw   new  IllegalStateException( "Illegal code: [" +start+ "," +end+ "]" );   
  58.                 next =( char )(' 0 '+end-start- 1 );   
  59.             }   
  60.             sb.insert( 0 ,next);   
  61.             end =start - 1 ;   
  62.         }   
  63.          return  sb.toString();   
  64.     }   
  65.        
  66.      /**  
  67.     * 将str编码为新的字符串  
  68.     */   
  69.      public   static  String encode(String str){   
  70.         StringBuilder sb = new  StringBuilder();   
  71.          for ( int  index = 0 ;index
  72.              char  c =str.charAt(index);   
  73.                
  74.              if (c==ESC_C){   
  75.                 sb.append(ESC_S);   
  76.             }   
  77.              else   if (c>' 0 '&&c<=' 9 '&&index+ 1
  78.                  char  next =str.charAt(index+ 1 );   
  79.                  for ( int  count =c-' 0 ';count>= 0 ;count--)    
  80.                     sb.append(next);   
  81.             }   
  82.              else {   
  83.                 sb.append(c);   
  84.             }   
  85.                
  86.              if (index+ 1
  87.         }   
  88.          return  sb.toString();   
  89.     }   
  90. }  
  • StringCode.rar (1.1 KB)
  • 描述: 本帖的代码打包
  • 下载次数: 56
分享到:
评论
2 楼 Eastsun 2007-08-03  
这个是数字后面跟'_'的情形.
next ==ESC_C说明后继字符为'_',str.charAt(end-1)==ESC_C说明该字符为数字
1 楼 leo_dream 2007-08-03  
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 ++;   
            }   
这段代码是什么意思

相关推荐

    基于字符串模式匹配算法的病毒感染检测问题_算法_数据结构_

    在这一背景下,我们有一个目标字符串(通常代表一段文件内容)和一个模式字符串(可能是已知的病毒签名)。我们的任务是检查目标字符串中是否存在模式字符串,如果存在,则可能存在病毒感染。 常见的字符串模式匹配...

    字符串面试题整理

    这些题目覆盖了字符串操作的基本概念,如遍历、比较、组合与排列、回文、字符串匹配以及数据类型转换。理解和掌握这些知识点对于提升编程技能和应对面试至关重要。在实际应用中,还需要注意性能优化、错误处理以及...

    C语言字符串的练习题和答案

    根据提供的文件信息,我们可以从中提炼出与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.把...

    Code_笔试题_字符串压缩_

    1. **字符串操作**:熟悉字符串的基本操作,如遍历、查找、插入和删除。这是处理字符串问题的基础。 2. **循环与条件判断**:在遍历字符串时,需要通过循环来检查每个字符,同时用条件判断来确认当前字符是否与前一...

    比较字符串1

    这个问题涉及到的主要知识点包括字符串操作、字典序比较以及基本的ASCII码理解。 首先,我们需要了解什么是字典序。在计算机科学中,字典序通常用于对字符串进行排序,就像我们在字典中查找单词一样。字典序是按照...

    PTA 6-13 函数实现字符串逆序

    总之,"PTA 6-13 函数实现字符串逆序"是一个基础但重要的编程练习,它可以帮助你深入理解和熟练掌握字符串操作、函数设计以及算法效率分析。通过解决这类问题,你可以提高编程技能,为更复杂的算法和数据结构挑战...

    数据结构和算法,字符串操作等常见试题

    包含面试中经常考的数据结构,算法以及字符串的操作等常见的面试问题,经典解答

    字符串常见的算法题经典

    本节我们将探讨一些常见的字符串算法题,包括字符串反转、将整数转换成字符串、字符串拷贝、字符子串删除等。这些算法题都是IT行业中非常重要的基础知识。 一、字符串反转算法 反转字符串是字符串处理中非常重要的...

    吕鑫:最博大精深的C语言视频教程 第11天 【第3堂课】字符串操作的算法研究(面试题)

    麦克风没插好,本节没声音;...主要讲解了数组做参数,以及一些作业中要求做的一些字符串函数。 如果实在想学这一节内容,可以参照我们推出最新的VS2015的视频教程。 讲的内容基本是一样的,全套视频无损失。

    c++字符串处理汇总

    - 使用C++标准库中的算法,如`std::sort`, `std::transform`等,可以简化字符串操作。 - 对于性能敏感的场景,了解底层的字符数组操作,能优化代码效率。 以上是C++字符串处理的基础知识,实际编程中还会遇到更多...

    js代码-JS 两个字符串算法题

    在JavaScript编程中,字符串处理是常见的任务之一,尤其是在面试或日常开发中,字符串算法题经常出现,考验开发者对字符串操作的熟练程度和逻辑思维能力。本篇将深入探讨标题所提及的"JS 两个字符串算法题",并结合...

    字符串排序

    - **操作**: 创建一个字符串`s`并调用`arc`方法对其进行排序,然后打印结果。 **3.1.2 排序方法** - **函数**: `arc`,接受一个字符串参数`s`。 - 将字符串分为两部分:前半部分`head`和后半部分`tail`。 - 对前...

    蓝桥杯c++-蓝桥杯竞赛练习之算法提高题字符串比较.zip

    在准备参加蓝桥杯竞赛的过程中,C++编程语言和算法是关键领域,特别是字符串操作,因为它们经常出现在各种算法题目中。本压缩包文件“蓝桥杯c++_蓝桥杯竞赛练习之算法提高题字符串比较”显然是为帮助参赛者提升这...

    按照字符串顺序从小到大排序,删除重复字符

    标题中的任务是“按照字符串顺序从小到大排序,删除重复字符”,这通常是一个字符串处理的问题,涉及到了排序算法和字符数组的操作。在这个问题中,我们可以看到一个简单的C语言程序实现,它使用冒泡排序对字符串中...

    KMP字符串匹配模板

    ### KMP字符串匹配算法 #### 一、简介 KMP(Knuth-Morris-Pratt)算法是一...通过对next数组的构建以及高效匹配策略的设计,KMP算法成功解决了传统暴力匹配中存在的重复计算问题,成为字符串匹配领域的一个经典算法。

    华为编程题及字符串编程

    接下来,关于字符串操作的常见方法。在Python中,我们可以利用内置的字符串方法如`split()`用于分割字符串,`join()`将数组合并为字符串,`replace()`替换子串,`strip()`去除两侧的空白字符,以及`lower()`和`upper...

    计算机常见算法面试题

    本资源摘要信息涵盖了计算机常见算法面试题,主要涉及链表、字符串操作、搜索算法等方面的知识点。下面是对标题、描述、标签和部分内容的详细解释: 标题:计算机常见算法面试题 该标题表明了这是一份计算机常见...

    华为od-华为od练习题之求字符串字符匹配-题库题解.zip

    "华为od-华为od练习题之求字符串字符匹配-题库题解.zip" 这个标题表明,这是一个与华为OD(可能是Online Judge或者某种在线编程训练平台)相关的压缩包文件,其中包含了关于字符串字符匹配的练习题目及其解答。...

Global site tag (gtag.js) - Google Analytics