全国软件专业人才开发与设计赛题之高难度题“字符串的划分”

本文主要是介绍全国软件专业人才开发与设计赛题之高难度题“字符串的划分”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明版权归作者WeiSteven所有,转载请注明! 

 字符串划分:

首先系统提供一系列的字符串,每个字符串具有一定的权值,切字符串唯一。

求解任意一个字符串的所有可能划分,并输出对应的权值和。

 

Example:

BaseString.txt内容

 a 9

aa 21

aab 33

bc 22

bbc 30

cd 10 

cdd 25


待拆分字符串例如:

aaabc

输出:

a aa bc 52

……(还有两种组合,不再列出)

题目难度不大,关键是效率,如果基于字符串的匹配,势必在长字符串的分割匹配查找中的效率极低。

本程序构造了字典树,进而进行字符串的分割操作,效率提高了不少: 

参考程序代码:

  1  #include  < stdio.h >
  2  #include  < string .h >
  3  #include  < stdlib.h >
  4 
  5  /* ---------------------------
  6  函数需要进行不同字符串的匹配
  7  本程序构造一个52个孩子结点的“字典树”
  8  字典数的孩子编号通过getIndexByChar()函数获得
  9  a b c d……A B C……X Y Z
 10  用于快速的对子串匹配工作
 11  --------------------------- */
 12 
 13 
 14  // 构造一个字典数结点
 15  struct  Node
 16  {
 17       int  value; // 纪录树根到此结点的权值
 18      Node *  next[ 52 ]; // 26*2个字母所对应的下结点
 19  };
 20 
 21  // 全局变量声明区
 22  Node root;
 23  char  line[ 100 ]; // 存放从文件中读取得数据,然后进行处理对树的维护
 24  FILE *  stream; // 文件描述符
 25  char  strTo[ 100 ]; // 读取被分析的字符串
 26  int  var[ 100 ]; // 代表dfs不同深度在字符串串中的间隔长度
 27  int  varValue[ 100 ];
 28 
 29 
 30  // 进行内存的初始化
 31  void  memNext(Node *  r)
 32  {
 33       for ( int  i = 0 ;i < 52 ;i ++ )
 34      {
 35          r -> next[i] = NULL;
 36      }
 37  }
 38 
 39  // 根据字符来获得其索引
 40  int  getIndexByChar( char  t)
 41  {
 42       if (t >= ' a ' && t <= ' z ' )
 43           return  t - ' a ' ;
 44       else   if (t >= ' A ' && t <= ' Z ' )
 45      {
 46           return  t - ' A ' + 26 ;
 47      }
 48       else
 49           return   - 1 ;
 50  }
 51 
 52  // 向数据字典数中插入一条信息
 53  void  insertItem( char *  line)
 54  {
 55       char  st[ 50 ];
 56       int  v;
 57      sscanf(line, " %s%d " ,st, & v);
 58       int  len = strlen(st);
 59      Node *  tNode =& root;
 60      Node *  newNode;
 61       char  c;
 62       for ( int  i = 0 ;i < len;i ++ )
 63      {
 64          c = line[i];
 65           if (tNode -> next[getIndexByChar(c)] != NULL)
 66          {
 67              tNode = tNode -> next[getIndexByChar(c)];
 68          }
 69           else
 70          {
 71               // 新建结点
 72              newNode = (Node * )malloc( sizeof (Node));
 73              newNode -> value = 0 ;
 74              memNext(newNode);
 75              tNode -> next[getIndexByChar(c)] = newNode;
 76              tNode = newNode;
 77          }
 78      }
 79      tNode -> value = v;
 80  }
 81 
 82  // 利用递归方法进行内存的释放
 83  void  deleteNode(Node *  node)
 84  {
 85       if (node != NULL)
 86      {
 87           for ( int  i = 0 ;i < 52 ;i ++ )
 88          {
 89              deleteNode(node -> next[i]);
 90          }
 91          free(node);
 92      }
 93  }
 94 
 95 
 96  // 获取数中对应的权值,不是一个短语则为-1,0代表没这个短语
 97  int  getValue( char *  s)
 98  {
 99      Node *  t =& root;
100       int  len = strlen(s);
101       for ( int  i = 0 ;i < len;i ++ )
102      {
103           if (t -> next[getIndexByChar(s[i])] != NULL)
104          {
105              t = t -> next[getIndexByChar(s[i])];
106          }
107           else
108          {
109               return   - 1 ;
110          }
111      }
112       return  t -> value;
113  }
114 
115  // 对数据进行处理,试探性的处理,depth代表dfs匹配的深度
116  void  dfs( char *  str, int  depth)
117  {
118       int  len = strlen(str); // 取得当前点后还有多少字符
119       char *  p = strTo; // 指针,对字符串进行指示
120       // 0个字符,代表已经成功完成,现在要进行显示
121       if (len == 0 )
122      {
123           int  sum = 0 ;
124           for ( int  i = 0 ;i < depth;i ++ )
125          {
126               for ( int  j = 0 ;j < var[i];j ++ )
127              {
128                  printf( " %c " , * (p ++ ));
129              }
130              putchar( '   ' );
131              sum += varValue[i];
132          }
133          printf( "  %d\n " ,sum);
134      }
135      Node *  node =& root;
136      {
137           for ( int  i = 0 ;i < len;i ++ )
138          {
139               if (node -> next[getIndexByChar(str[i])] != NULL) // 不为空,则可以分割
140              {
141                   if ( node -> next[getIndexByChar(str[i])] -> value != 0 )
142                  {
143                      var[depth] = i + 1 ; // 保存需要间隔的长度
144                      varValue[depth] = node -> next[getIndexByChar(str[i])] -> value;
145                      dfs( & str[i + 1 ],depth + 1 );
146                  }
147                  node = node -> next[getIndexByChar(str[i])];
148              }
149               else
150              {
151                   return ;
152              }
153          }
154      }
155  } //
156 
157  int  main()
158  {
159      
160       // 初始化root中的数值
161      memNext( & root);
162       if ((stream  =  fopen(  " BaseString.txt " " r "  ))  !=  NULL)
163      {
164           while (fgets( line,  100 , stream )  !=  NULL)
165          {
166               // 对字典数进行维护
167              insertItem(line);
168          }
169      }
170 
171      scanf( " %s " ,strTo); // 读取待分析的字符串
172 
173       // printf("%d\n",getValue("bc"));
174 
175      dfs(strTo, 0 ); // 0代表dfs深度
176 
177       for ( int  i = 0 ;i < 52 ;i ++ )
178          deleteNode(root.next[i]);
179       return   1 ;
180  }

 

 

 

这篇关于全国软件专业人才开发与设计赛题之高难度题“字符串的划分”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/678578

相关文章

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字