开这个坑呢,主要是为了督促自己学习PHP,并且能尽早进入CTF的实战.虽然说PHP不算难(对于已经掌握一门语言的来说),但如果算法和函数都不熟悉的话啥也干不了.
题目
You’re given strings J representing the types of stones that are jewels, and S representing the stones you have. Each character in S is a type of stone you have. You want to know how many of the stones you have are also jewels.
The letters in J are guaranteed distinct, and all characters in J and S are letters. Letters are case sensitive, so “a” is considered a different type of stone from “A”.
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
范例:
示例 1:
输入: J = “aA”, S = “aAAbbbb”
输出: 3
示例 2:
输入: J = “z”, S = “ZZ”
输出: 0
思路
想法是朴素的:遍历示范字符串$J,对每个字母在字符串$S中查找并计数.
- 为了遍历$J,这时候需要用到将字符串分割为数组的函数
str_split
.
该函数的声明为:
第一个参数是要分割的字符串,第二个是可选参数,是分割长度.str_split(string,length)
返回一个Array
型数组变量,可以用循环子i
做遍历. - 遍历前要用到数组的长度来限制
i
,可以用srtlen()
在分割之前求得字符串长度,也可用count()
求数组的成员数,也就是字符串的长度. - 在
$S
中计数,需要用到substr_count()
函数.该函数的作用是在一个字符串中计数和另一个字符串一样的子串.
该函数的声明为:
第一个参数是被查找的串,第二个是目标字串.第三个和第四个是可选参数,传入被查字串的起迄点和查找长度.substr_count(string,substring,start,length)
注意:如果start+length>strlen会触发警告.
返回子串在字符串中的数目.
那接下来就很简单了.
代码
class Solution {
/**
* @param String $J
* @param String $S
* @return Integer
*/
function numJewelsInStones($J, $S) {
$datapan=str_split($J);
$datalength=count($datapan);
$res=0;
for($i=0;$i<$datalength;$i++)
{
$res=substr_count($S,$datapan[$i])+$res;
}
return $res;
}
}
性能情况和总结
还不错?!不过看详细信息绝大多数都是这么写的.所以也没什么好说的.只能说还有很长的路要走.