有限状态机的简单使用案例:“将字符串中多于一个的空格变为一个空格输出”
来源:互联网 发布:mac pro 验证码 编辑:程序博客网 时间:2024/06/05 21:51
<?php// 有限状态机的简单应用// 解决问题:将字符串中多于一个的空格变为一个空格输出$str = 'Memcached is simple yet powerful.'; //最初字符串var_dump($str);$state = 0; // 初始状态$index = 0;$len = strlen($str); // str length$input = 0; // input$result_str = '';while($index < $len) {$c = $str[$index++]; // 读入字符$input = get_input_type($c); // 输入类型// $input 输入类型:0 非空格字符, 1 空格// $state 状态:0 初始状态, 1 遇到第一个空格, 2 遇到第二个以及更多空格// 状态迁移if($state === 0 && $input === 0) {$state = 0;$result_str .= $c; //采取相应的动作} elseif($state === 0 && $input === 1) { // 遇到第一个空格, state = 1, 输出该空格$state = 1;$result_str .= $c;} elseif($state === 1 && $input === 0) {$state = 0;$result_str .= $c;} elseif($state === 1 && $input === 1) { // 遇到连续的第二个空格, state = 2, 该空格不再输出$state = 2;} else if($state === 2 && $input === 0) {$state = 0;$result_str .= $c;} elseif($state === 2 && $input === 1) { // 遇到连续的三个空格, 状态保持不变, 空格依然不输出$state = 2;}}// 获取输入类型function get_input_type($c) {if($c === ' ') {return 1;}return 0;}var_dump($result_str);
将问题抽象化:
抽象出来两个二维数组:状态迁移表,执行动作表
二维数组的第一维是 $state 状态值, 第二维是 $input 输入类型
改进代码如下:
<?php// 有限状态机的简单应用// 解决问题:将字符串中多于一个的空格变为一个空格输出$str = 'Memcached is simple yet powerful.';var_dump($str);// 将问题抽象// int [state][input]// 状态迁移表$state_transition = array([0, 1],[0, 2],[0, 2],);// 动作表$act_table = array(['concat_str', 'concat_str'],['concat_str', 'act_null'],['concat_str', 'act_null'],);$state = 0; // init state$input = 0; // input$index = 0;$len = strlen($str); // str length$result_str = '';$char = '';while($index < $len) {$char = $str[$index++]; // 读入字符$input = get_input_type($char); // 输入类型$callback = $act_table[$state][$input];call_user_func($callback);$state = $state_transition[$state][$input];}// 获取输入类型function get_input_type($c) {if($c === ' ') {return 1;}return 0;}// 连接字符串function concat_str() {global $result_str;global $char;$result_str .= $char;}// 什么也不做function act_null() {return ;}var_dump($result_str);
0 0
- 有限状态机的简单使用案例:“将字符串中多于一个的空格变为一个空格输出”
- c#输入一个字符串,并把字符串的第一个字符变为大写,如果字符串中有空格则把空格的下个字符变为大写之后输出
- 去除字符串中的首尾空格并将连续的空格变为一个
- 将字符串中连续的空格转换为一个空格
- Python输出出现多于空格的问题
- 删除一个字符串中连续的空格
- 删除一个字符串中连续的空格
- 使用正则表达式将一个字符串中连续的多个(两个或者两个以上)替换为一个空格
- 删除字符串中多余的空格]给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个
- java中输出一个字符串里面的空格,字母还有数字的数目举例说明
- 编写一个将输入复制到输出的程序,并将连续的多个空格用一个空格代替。
- 将一个以上连续空格转为一个空格输出
- Java将一个字符串中的多个连一起的空格变成单个空格
- 将一个字符串中的多个连在一起的空格变成单个空格 Java 正则表达式
- 将一个字符串中的多个连一起的空格变成单个空格
- Java将一个字符串中的多个连一起的空格变成单个空格
- javascript将字符串中的多个空格替换为一个空格的正则实例
- Java最简单的字符串4位加一个空格
- Sublime Text3 之二十个强大插件(必须收藏)
- JAVA加解密 -- 数字签名算法
- HDU 1539 Shredding Company dfs枚举每位数字的空格
- 手把手 教你 把Lua 打造一个Windows 下的dll
- java.io.IOException:stream closed 异常的原因及处理
- 有限状态机的简单使用案例:“将字符串中多于一个的空格变为一个空格输出”
- Coursera ML笔记 --- week1:单变量的线性回归+梯度下降法
- Spring源码解读 Spring初始化Bean时扩展
- Spark性能调优-kyro
- JSP标准标签库之格式化标签+(SQL标签+XML标签+JSTL函数的语法)
- java.探索EJB的使用
- 适配器模式 (Adapter-Pattern)
- hdu2191 多重背包
- UVA, 202 Repeating Decimals