在有序但含有空的数组中查找字符串
来源:互联网 发布:联通网络电视客户端 编辑:程序博客网 时间:2024/05/21 07:02
比如给定一个字符串数组,“”,“ab”,"ab","","","","xx","yy","zz",查找ab字符串最左边的位置就是1,而不是2。
如果要找的字符串是空,或者根本没有找到,就返回-1
思路采用二分法,但是这里和普通二分不同,要进行判断
设要找的字符串为str,start=0,end等于字符串数组最后一个位置
如果当前mid处值等于要找的,这时候传给全局变量Pos,但是这个pos并非最终结果,因为很有可能他的左边,还有要找的字符串,所以要把end设为mid-1.
如果当前mid处值不等于要找的,这里有两个情况
一个是等于空串,这时候要从空串处从右到左遍历,如果遍历到最终,还是没有找到非空,肯定是返回-1了
如果找到了非空串,还要分三种情况判断
一种是等于要找的字符串,这时候就把位置付给全局变量pos
一种是小于要找的字符串,证明要找的字符串一定在右半区间,左半区间已经不用找了,start赋值为mid+1
一种是大于要找的字符串,这时候证明要找的肯定在其左边,end赋值为其下标-1。
一种是不等于空串,这样就按照普通二分来处理,大于要找的,就在左半区间找,小于要找的,就在右半区间找。
#include<iostream>#include<string>using namespace std;int getPosition(string* s,string aim,int n){ //int n=s.size();//这里不能求s的长度 if(n==0) return -1; int left=0; int right=n-1; int res=0; int mid=0; while(left<=right) { mid=left+(right-left)/2; if(aim==s[mid]) { res=mid; right=mid-1; } else if(s[mid]=="")//注意空字符串的表示方法 { int temp=mid;//这里不能是mid-1 while(temp>=left&&s[temp]=="") temp--; if(temp<left||s[temp]<aim) left=mid+1; else { res=s[temp]==aim?temp:res; right=temp-1; } } else { if(s[mid]>aim) right=mid-1; else left=mid+1; } } return res;}int main(){ string s[]={"aa","cd","cd","de","de","","","eg"}; cout<<getPosition(s,"cd",sizeof(s)/sizeof(s[0]))<<endl;//注意传入参数如何求数组的长度 system("pause"); return 0;}
阅读全文
0 0
- 在有序但含有空的数组中查找字符串
- 在有序但含有空的数组中查找字符串
- 在有序但含有空的数组中查找字符串
- 在有序但含有空的数组中查找字符串
- 字符串问题---在有序但含有空的数组中查找字符串
- 在有序但含有None的数组中查找字符串 Python 版
- 在有序但是含有空的字符串中查找最左边特定字符串的位置
- 迭代用在有序数组二分法查找中,递归的二分法查找更简洁,但速度可能会慢一点
- 在一个两段有序的数组中查找
- 在有序递增数组中查找一个缺少的数字
- 在一个有序的旋转数组中,查找给定值
- 在一个旋转有序数组中,查找最小的数
- 二分法在有序数组中进行查找
- 9.5-字符串有序数组的二分查找
- 在查找有序二维数组中查找元素
- 折半查找------在一个升序的有序数组中查找某个具体的数字
- 查找在一个字符串中含有多少个相同的子字符串
- 在数组(序列、有序集合)中查找特定数组
- MYSQL触发器T-SQL
- Beginning Spring学习笔记——第5章(一)ORM和JPA基础
- Android签名验证原理解析
- HashSet,TreeSet,LinkedHashSet 的用法和区别
- 剑指offer(十三)调整数组顺序使奇数位于偶数前面
- 在有序但含有空的数组中查找字符串
- ZooKeeper原理浅析
- 拆分PDF文档需要什么软件?如何进行操作?
- C++中类模板和实现分离的方法
- 动态SQL
- get方式长度受限,如何将较长数据传递到后台
- delphi合并两个数组例子
- 文本框及 Combo Box内数据清除
- 二叉树 基本概念